Это копия, сохраненная 28 июля 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Вики по вкатыванию в джаву🎓: https://github.com/java2ch/java-thread/wiki
Предыдущий: >>2728034 →
Годный перекат брат ежжи жи ес ☝️
Почему без тега?
Не надо пересоздавать, просто репортни модеру, чтобы добавил тег.
ооп говорит о том, что данные объекта должны обрабатываться методами этого самого объекта, например, есть спринг приложение с некоторым пользователем, у пользователя надо обновить поля, штобы ничего не пошто по пизде неплохо было бы вытянуть пользователя из базы по ид, переписать ему поля и засунуть обратно на базу. вот тут мы и подходим к тому, что, по идее, это самое доставание из базы и сравнение полей должно быть методами пользователя, но ебучий спринг не дает ничего заинжектить в ентити. получается, нам нужно делать утилитный дао класс, а утилитные классы не оч сочитаются с ооп, так сказатб, антипаттерн. собсна где правда, везде кричат про ооп, а по факту, самый распространенный фреймворк использует mvc паттерн, который ниразу не ооп... может я чето проебал и mvc и ооп отлично сочитаются?
и еще, нахуя нужен слой сервис, дао обмазывает объекты логикой, контроллер обрабатывает запросы, а сервис тупа по середине? просто штобы вся хуйня не портила вид контроллера?
Он начинает догадываться. Быстро снизьте ему зп, чтобы вместо ООП думал о говяжьях анусах.
> работяги, у меня тут встал вапрос, разве инъекция зависимостей в спринге не противоречит принципу ооп?
В джаве на хую вертели ООП. Была бы поддержка процедур - классы никто бы не юзал.
> и еще, нахуя нужен слой сервис, дао обмазывает объекты логикой, контроллер обрабатывает запросы, а сервис тупа по середине? просто штобы вся хуйня не портила вид контроллера?
Поймёшь, когда увидишь сервисы в 50 раз объёмнее DAO.
слыш хуйло в другой тред
Если спригодебилы не юзают это не значит что никто не юзает.
Посмотри содержимое классов jre, те кто писал классы не юзают ооп.
Тег стоит
> что данные объекта должны обрабатываться методами этого самого объекта
добро пожаловать в последователи бугаенко. В идеале не должно быть геттеров и сеттеров, должна быть логика и вычисления прям внутри классов
Я не даю всяким неудачникам вроде тебя
В одном классе все приложение.
>В джаве на хую вертели ООП
Не так. Это не в джаве вертели на хую ООП, это джависты вертели на хую ООП. Джависты в прошлом - коболисты, дедам переход с процедур на ООП дался тяжело.
Исторически в живых остался один принцип ООП - "когда нельзя но очень хочется, то можно".
И статические инициализаторы, и нестатические инициализаторы, и инициализация полей - все это само по себе такой же байткод, какой и весь остальной код. Твой вопрос не имеет смысла, переформулируй.
Сбер? Там переходы на ГО. Джава это легасиговно.
Тинькофф? Там даже на си решетку переходят.
Яндекс? Ровно один проект, причем самый днищенский маркет.
ВК? Пара проектов
И так можно до бесконечности...
> Сбер? Там переходы на ГО. Джава это легасиговно.
Ты про какой Сбер? В моём Сбере дохуя новых проектов пишут на 11/17 жабе, а Go только у пары хипстеров с геймификацией, хайпом HR и другими нахлебниками, не относящимися к основному профилю организации.
Андроид ебать
У тебя толерантность к алкоголю высокая значит. Попробуй под водяру
Кто бы что ни говорил, но "Git за вечер" можно выучить, только поебавшись перед этим несколько месяцев с SVN, Mercurial, CVS, Perforce и другим подобным говном. Множество способов сделать одно и то же, дохуя нюансов, дохуя новых концепций, которые без реального опыта сложно понять.
Если ты ищешь себе самый дешёвый макбук тупо ради бренда, лучше сразу откажись от этой идеи. Нормально кодить ты на нём не сможешь.
Понятно. Мне бы хотелось прочитать мнение именно пользователя макбука, т.к. у пользователей виндовых ноутбуков в превалирующем большинстве случаев мнение ангажированно и необъективно. Запускал идею, докер, постгрес сервер на прошке 2013 года, и всё работает более-менее сносно, при тех параметрах что у него есть. Боюсь представить, что там будет на современном железе.
> Идея часто подтормаживает.
Как интересно. У меня i5 10-го поколения, и ничего не подтормаживает, хотя могу запускать по 3 штуки одновременно (бэкенд, фронтэнд и crm).
У меня 8гб, если запускать идею, и особенно андроид эмулятор, то из свопа вылезать не будешь. На 16гб должно быть полегче
Да, эмулятор очень много требует ресурсов. Но я обычный бэкендер, поэтому мне должно быть достаточно 8 гб.
Эти 8 гигов у тебя хром выжрет в одно ебало, а тебе еще идею кормить. А это - еще минимум комфорта. По максимуму прикольно еще докер с СУБДшками держать под рукой.
И ладно бы это был картонный бомженоут десятилетнего возраста за карманные деньги, я бы понял тебя, мол, черная полоса у чувака, денег нет, а вертеться надо. Нахуя связываться с анальным яблоком при таких вводных - вообще не понятно.
Я в свое время на 16гиговом маке сидел, мне не хватало, 8 это вообще забей.
И это еще при условии что ты свалил. Если ты до сих пор в РФ, с маком ты - анальный заложник пидарасов, которые тебе в любой момент поддержку выключат в рамках очередного витка санкций, и будешь как дурак, отвалимши кучу баксов пидарасам за брэнд, через 30 слоев выпиена доказывать всем что ты не верблюд.
Программирование 👩💻 — это не столько про анальное крудошлёпство 🍩👋, сколько про стиль мышления🤔.
Высокоуровневая абстракция 🙏🛐, поиск сходных черт 🦧🔎🐷🔰👶, оптимизация 🐒📉💥 — всё это высшие интеллектуальные способности 🧠, что образуют такой прочный симбиоз 👉👌 с программированием на Java ☕😜.
я вчера из за этого гита удалил проект который ебашил несколько месяцев, хорошо что в идее есть история
Идея подтормаживает потому что за подтормаживания отвалили кучу бабок жидам, а не потому, что ресурсов пк не хватает.
У вас есть стек любимых технологий, которые вы опробовали на многих проектах и он каждый раз давал вам качественный результат? Какой он?
Сосёшь хуи.
jdbc template + postgres
Эта хуйня походу подыхает после начала сво. В ковидные денежные годы у нас жадный кабаныч выделил бабок дотнетчикам и увеличил им команду, но после всех событий тот проект закрыли и челов переучили на спринг
OSGi, ебана-нах.
git create branch foo
или
git branch foo
или
git branch create foo
или
git checkout foo
так падажжи ебана
Spring Boot + Apache Commons
Ещё там мержить и ребейзить надо уметь и понимать плюсы и минусы обоих подходов. Я вот мерж более менее понял, а от ребейза у меня голова разболелась.
> create branch
Специально для джавистов надо сделать систему контроля версий, которой будет нереально пользоваться без автодополнения. Типа gitVersionControlSystemCreateBranchIfNotExistsGayLongCocksSuckRequiredTransactional.
а ты типа не джавист? хуле делаешь в треде? пошел нахуй смеяться он еще над нами будет
В чём проблема создать легковесную ИДЕ? Почему нужен топовый комп, чтобы писать обычные текстовые файлики?
открой блокнот да пиши еблан
ток потом не жалуйся что тяжело AbstractHuiPizdaZalupaBeanFactoryPostProcessorInitializerBean писать
Ага, написали сначала абстрактные хуйзалупы и теперь пишут иде для героического превозмогания.
Я не могу писать в блокноте, потому что сейчас требование везде - это идея. Современный джавист - это идея-разработчик. Все гайды по джаве - это как найти нужную кнопочку в идее.
Вот буквально сегодня искал инфу по JUnit и 90% гайдов - это про идею как там вызвать нужное меню и прожать нужные галочки, чтобы сформировались заготовки тестов.
иди нахуй шарпоблядь
Нужна проприетарная серверная версия идеи, как рантайм для выполнения IdeaLang. Будут ставить серверную идею вместо серверов приложений, и на ней хостить приложуху.
Не, чел, ты не шаришь о чем спрашиваешь.
Зырь.
Пикрил 1 - это класс.
Если ты этот класс скомпилируешь, ты получишь файл Zalupa.class, в котором будет байткод класса Zalupa.
И если ты потом сделаешь javap -c -p -s -l Zalupa.class, ты увидишь содержимое байткода класса, как на пикрил 2. Если присмотришься, то на пикриле 2 увидишь байткод всех 4х языковых конструкций (правда компилятор сделал еще свои преобразования, из-за чего статическая переменная инициализируется в блоке static, а блок инициализации приклеился в начало конструктора, но не суть).
Все это - байткод. Включая конструктор. О каком bytecode execution'е ты спрашиваешь, который идет раньше или позже чего то, если ВСЕ из тобою вышеперечисленного - байткод? Твой вопрос тупо - оксюморон и не имеет смысла. Опиши чего добиться пытаешься, какую задачу решаешь.
Принципиально не пользуешься автодополнением, чтобы показать, кто здесь тру петушарпер?
orgApacheMavenBuildPomXmlProjectHugeNiggaPenisInsideYourButtWithCleaningTargetDirectoriesAndInstallationToLocalRepository
> Че там на счет зп студенту
40к до вычета налогов.
> шкиле
Бесплатная рабочая сила.
> Разраебка плагинов для майнкрафта
Платить будешь ты, ещё и должен останешься.
Явно меньше чем на великом дотнете (на котором пишут весь импортозамещающий софт топ конторы), потому что на вакансию джава миддла приходит по 500 челов в неделю
Схуяли испортозамещение пишут на дотнете?
Есть Eclipse и NetBeans.
А ещё можно скачать intellij idea очень старую версию года 2016-го например.
ра ?
Встречный вопрос. В чем проблема не быть нытиком ебаным, и смотреть на вещи обьективно? Идея тяжелая по двум причинам:
1. Плагины
2. Анализаторы
И то и другое отключается, после чего идея жрет не больше браузера. Если для тебя и этого мало, ной дальше - "в чем проблема сделать легковесный браузер в 2023м году", блять.
Майнеров нахватал чай. Линух ставь.
Охуели.
Ахуел? К слову, что лучше в плане оптимизации clr от божественного Microsoft или древний HotSpot?
Как в принципе глубоко понимать фреймворки по типу спринга? Если нужно что-то сделать, что выходит за границы гайдов и их кривой документации, которая не покрывает и сотой части того, что происходит в реальном проекте, то тут же начинаешь закапываться в интернете и перелистывать сайт за сайтом, в попытках накопать информацию. При этом с годами лучше не становится и спринг давит своей монструозностью и нелепостью. Какие-то совсем простые вещи делаются на автомате. Начинаешь копать глубже и вот уже дока этого не покрывает, лезешь на гитхаб ишьюс, стековерфлоу и прочие сайты, где люди постят воркэраунды, багрепорты и прочее
Бля, а как в него вообще вкатиться? Вот думаю в июле найти работу, а спринг нихуя не знаю.
Это нормально.
Противоречит. Поэтому ООП идет нахуй.
>>Джависты в прошлом - коболисты
Те кто еще живой переходили на жабу/шарп с плюсов, иногда с паскаля. Кобол на западе был, в РФ его никто и не видел даже.
>>переход с процедур на ООП
ОПП остался где то в жабе 7
git checkout -b foo
но это не точно, я в идее кнопочку New Branch тыкаю
>>33131
раз в полгода надо что то черипикнуть или заребейзить - погуглить проще чем запоминать эту ебень
>>33134
>>Специально для джавистов надо сделать систему контроля версий
так в идее все есть - кнопку нажал и все работает. не надо с консольками пердолиться. и автодополнение в комментах есть.
В начале года мидл был 160к, щас не смотрел - глянь по хабру там с весны мало что изменилось.
>>миддла с 3х летним опытом
я бы 200+ запрашивал, но сам я мидл с годом опыта и даже на 160 не вышел.
Ты идею запускать собрался или битки майнить параллельно с играми в 4к? Нахуя тебе видюха дороже 20к?
Ну посидел денег в инете - нашел ответ. Че сложного то? Ясен хуй в доке тебе не напишут что мы тут проебались и в версии 2.28 был баг, но в 14.88 его починили. А если что - вот костыль.
Если ты ебаную менюшку сам не найдешь и в гугле забанен, нахуя ты вообще кодер и дышишь?
>Те кто еще живой переходили на жабу/шарп с плюсов, иногда с паскаля. Кобол на западе был, в РФ его никто и не видел даже.
Справедливо, но сути не меняет. Как кодили процедурно, так и кодят процедурно.
>ООП остался где то в жабе 7
И куда оно по твоему делось?
>Если нужно что-то сделать, что выходит за границы гайдов и их кривой документации
...то ты закрываешь пасть и делаешь как в рекомендуют в гайдах (ничего личного). Иначе ты начинаешь входить в конфликт со спринговой магией и спринг превращается из няшки в твой персональный анальный кошмар.
Усвой темы типа бинпостпроцессоров и написания своих стартеров. Смотри видосы евангелистов типа Борисова про кишки спринга.
>то тут же начинаешь закапываться в интернете и перелистывать сайт за сайтом, в попытках накопать информацию
Открой для себя стековерфлоу (не как источник для гугления, а именно как площадку, куда ты можешь свой вопрос задать). Без шуток. Спрингодевелоперы там часто отвечают, если вопрос задаешь грамотно.
Еще, учись дебажить. Развивай общую эрудицию касательно того, как работает джава и ее отдельные фичи, тогда механизмы спринга будут понятны прям из кода и гайдов. Ну и возьми за привычку спрашивать конкретику, а не абстрактную хуету, иначе с 75% вероятностью будешь послан нахуй как троль-шарпист.
Что курьезно: в доке не напишут, но в changelog'ах - вполне. Не говоря уже о том, что багтрекер открыт и доступен всем.
Как сказать энтити через какую промежуточную таблицу делается many-to-many, если я не хочу делать для этой таблицы отдельную энтити? Ее вообще не должно быть видно.
типа такого
@ManyToMany(mappedBy = "roles", table="r_user_role")
private Set<User> users;
JoinTable же. Что-та я затупил
Принципы ООП в целом абстрактная хуйня для академиков. Им следует только всякая студентота и зелёные.
Если понаблюдаешь за своими дедами, поймёшь, что в реальной разработке всякие принципы и паттерны практически никак не используются.
Опытные прогают по ТЗ, без переусложнения на ровном месте. Архитектура кода также на 80% складывается из ТЗ и текущей архитектуры. Никаких значительных изменений там нет и быть не должно, если ТЗ конечно пишут не полные наркоманы, что в бизнесе исключено: это слишком дорого.
В принципы и паттерны код никто, ну кроме студентоты, специально не укладывает. В реальной разработке никаких принципов в принципе нет: как удобно, так логику и разбивают.
Просто так получается, что большинство таких решения так или иначе можно описать этими принципами и паттернами, поэтому они и существуют. Но в реальной разработке их используют не для проектирования, и именно для описания, для объяснения.
Т.е. ситуация диаметрально противоположная ожиданиям студентоты: они думают что принципы первичны, что естественно, ведь их с них и начинали учить, чтобы объяснять теорию опираясь на некий общепринятый словарь, но на самом деле принципы вторичны, их используют только для объяснения устройства и работы кода, как раз как общепринятый словарь, чтобы все понимали о чем речь.
А все потому, что разработка по своей сути процесс нестандартный, творческий. Весь код принципами описать невозможно, только какие-то отдельные высокоуровневые составные части. На низком уровне слишком много скрытых нюансов.
Поэтому у студентоты постоянно горит от реального кода: все не так, как учили, везде не по канону, везде нарушают.
До них начинает доходить, только когда они увидят, что этот код написан не зеленым рукожопом, а опытным дедом, который тебя за пояс заткнет в любой задаче.
Опять же причина воспламенений в том, что студентота зелёная: она ещё не видит всей картины в целом, и мыслит только базовыми теоретическими примитивами, воспринимает все слишком близко и буквально.
Тот же DI например с точки зрения принципов лютый треш: код, который занимается тем, что с помощью грязных хаков залазит внутрь объектов и меняет их состояние произвольным образом, игнорируя области видимости и любые правила приличия. И формально это так и есть. Но существует он и используется не в рамках ООП принципов, а в перпендикулярной им плоскости: это архитектурный компонент, его задача сформировать архитектуру приложения, а не следовать ООП принципам. Его никто не наследует, и вызывают только один раз за все приложение: в ООП он вообще никак не используется. Зато он обеспечивает возможность существования ООП в приложении, пусть и путем некой магии, для непосвящённых.
И в целом такие решения вполне оправданы. Конечно в реальности они встречаются редко, но только из-за того, что решают нерешаемые легальными способами задачи, поэтому знать их нужно: это такой же инструмент, как и остальные. В 99 задачах он не пригодится, но зато в одной выстрелит, сэкономит много сил и времени, позволит оставить архитектуру более чистой и простой, и тем самым многократно окупит затраты на свое изучение.
Принципы ООП в целом абстрактная хуйня для академиков. Им следует только всякая студентота и зелёные.
Если понаблюдаешь за своими дедами, поймёшь, что в реальной разработке всякие принципы и паттерны практически никак не используются.
Опытные прогают по ТЗ, без переусложнения на ровном месте. Архитектура кода также на 80% складывается из ТЗ и текущей архитектуры. Никаких значительных изменений там нет и быть не должно, если ТЗ конечно пишут не полные наркоманы, что в бизнесе исключено: это слишком дорого.
В принципы и паттерны код никто, ну кроме студентоты, специально не укладывает. В реальной разработке никаких принципов в принципе нет: как удобно, так логику и разбивают.
Просто так получается, что большинство таких решения так или иначе можно описать этими принципами и паттернами, поэтому они и существуют. Но в реальной разработке их используют не для проектирования, и именно для описания, для объяснения.
Т.е. ситуация диаметрально противоположная ожиданиям студентоты: они думают что принципы первичны, что естественно, ведь их с них и начинали учить, чтобы объяснять теорию опираясь на некий общепринятый словарь, но на самом деле принципы вторичны, их используют только для объяснения устройства и работы кода, как раз как общепринятый словарь, чтобы все понимали о чем речь.
А все потому, что разработка по своей сути процесс нестандартный, творческий. Весь код принципами описать невозможно, только какие-то отдельные высокоуровневые составные части. На низком уровне слишком много скрытых нюансов.
Поэтому у студентоты постоянно горит от реального кода: все не так, как учили, везде не по канону, везде нарушают.
До них начинает доходить, только когда они увидят, что этот код написан не зеленым рукожопом, а опытным дедом, который тебя за пояс заткнет в любой задаче.
Опять же причина воспламенений в том, что студентота зелёная: она ещё не видит всей картины в целом, и мыслит только базовыми теоретическими примитивами, воспринимает все слишком близко и буквально.
Тот же DI например с точки зрения принципов лютый треш: код, который занимается тем, что с помощью грязных хаков залазит внутрь объектов и меняет их состояние произвольным образом, игнорируя области видимости и любые правила приличия. И формально это так и есть. Но существует он и используется не в рамках ООП принципов, а в перпендикулярной им плоскости: это архитектурный компонент, его задача сформировать архитектуру приложения, а не следовать ООП принципам. Его никто не наследует, и вызывают только один раз за все приложение: в ООП он вообще никак не используется. Зато он обеспечивает возможность существования ООП в приложении, пусть и путем некой магии, для непосвящённых.
И в целом такие решения вполне оправданы. Конечно в реальности они встречаются редко, но только из-за того, что решают нерешаемые легальными способами задачи, поэтому знать их нужно: это такой же инструмент, как и остальные. В 99 задачах он не пригодится, но зато в одной выстрелит, сэкономит много сил и времени, позволит оставить архитектуру более чистой и простой, и тем самым многократно окупит затраты на свое изучение.
И то что вероятность получить работу выше?
Вроде же наоборот - Java Spring топовый фреймворк, стандарт для банковских приложений.
Кто врет?
Платят столько же, вероятность получить работу ниже.
От тебя говном воняет, чел...
Да.
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>%АНОНЧЕ%</groupId>
<artifactId>spring_course1</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>spring_course1 Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.0.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>6.0.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>6.0.9</version>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
<!-- Thanks for using https://jar-download.com -->
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.19</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate.orm/hibernate-core -->
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.2.5.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate.common/hibernate-commons-annotations -->
<dependency>
<groupId>org.hibernate.common</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>6.0.6.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
</dependencies>
<build>
<finalName>spring_course1</finalName>
</build>
</project>
ChatGPT пишет что у меня не совместимые версии Spring и Hibernate, а также Hibernate Commons.
Это так?
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>%АНОНЧЕ%</groupId>
<artifactId>spring_course1</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>spring_course1 Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.0.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>6.0.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>6.0.9</version>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
<!-- Thanks for using https://jar-download.com -->
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.19</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate.orm/hibernate-core -->
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.2.5.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate.common/hibernate-commons-annotations -->
<dependency>
<groupId>org.hibernate.common</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>6.0.6.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
</dependencies>
<build>
<finalName>spring_course1</finalName>
</build>
</project>
ChatGPT пишет что у меня не совместимые версии Spring и Hibernate, а также Hibernate Commons.
Это так?
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://localhost:3306/my_db?useSSL=false&serverTimezone=UTC</property>
<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="connection.username">bestuser</property>
<property name="connection.password">bestuser</property>
<property name="current_session_context_class">thread</property>
<property name="dialect">org.hibernate.dialect.MySQL57Dialect</property>
<property name="show_sql">true</property>
</session-factory>
</hibernate-configuration>
org.hibernate.dialect.MySQL57Dialect - ChatGPT сказал что именно такая версия мне подходит, хотя в уроке Заура Трегулова указано следующее:
<property name="dialect">org.hibernate.dialect.MySQLDialect</property> - когда в файле hibernate.cfg.xml указываю эту строчку, Интележи Айдия подчеркивает красным и пишет:
Invalid Hibernate XML Configuration
Выучить - тупо звучит. Это не то что нужно учить или зубрить. Это просто прикладной инструмент - его надо осваивать, а не учить. А то некоторые его по 2-3 года "учат", и все без толку. Хотя осваивать его реально часа 4.
Смотри сам: чтобы понять что такое git, нужно понять что такое коммит, как коммиты между собой связаны, как и где они хранятся, понять концепцию меток: хеши, ветки, теги. Понять концепцию репозиториев.
И понять как с этим можно работать: как создать коммит, как его удалить, как создать и удалить ветку, как переключаться между ветками и коммитами, как подтягивать историю из внешней репы и выгружать туда свою.
Это реально маленький объем информации. И для старта вообще достаточно понять как добавлять ветки и коммиты и отправлять их а origin
Даже если брать консольку - это всего несколько команд: add, checkout, pull, push
Все, этого с головой хватит для обычной работы
По мере роста потребностей можно постепенно осваивать дополнительные команды: log, branch, init, merge, rebase, cherry-pick, revert, reflog. Но это уже специфика: некоторые о reflog через 2-3 года попыток "выучить" git узнают - так медленно у людей растут потребности. То есть до этого они с такими ситуациями, где нужен reflog, просто не встречались.
К тому же большинство разработчиков в git ходят через IDE/GUI, то есть с консолькой практически не контактируют - им даже команды осваивать потребности нет, достаточно заиметь понятие о самих концепциях git: что есть коммит, что есть ветка, что есть репа.
Так что да, освоить git за вечер вполне реально, если не ебланить и не отвлекаться на всякие соцсети/ютубики/мессенджеры, которые сожрут 80% времени, внимания и мотивации что-то делать.
Я не верю что кто-то не может понять что есть коммит, это же простейшая концепция.
>ChatGPT пишет что у меня не совместимые версии Spring и Hibernate, а также Hibernate Commons.
>Это так?
пиздит ИМХО.
Другой вопрос - почему у тебя JUnit настолько древний: аж третий, когда давным давно есть пятый.
>>34770
>org.hibernate.dialect.MySQL57Dialect - ChatGPT сказал что именно такая версия мне подходит,
https://docs.jboss.org/hibernate/orm/6.0/javadocs/org/hibernate/dialect/MySQL57Dialect.html
Пиздит. MySQL57Dialect депрекейтнут в пользу MySQLDialect.
Хватит хуйней страдать - чатгпт то чатгпт се... Хотя бы перепроверяй за ней, а то че ты как лох.
Вызови через курл. Воткни дебаг в контроллер и проследи по шагам как реквест выполняется.
if (response.body.code != "ok") then
Статус кодов дохуя, найдется, что вернуть в случае ошибки, обрабатывать без кодов, это пиздец хуйня тупая
вставляешь такой код 400 при бизнес-ошибке
@
фронт парсит ответ при 400
@
приходит реальная 400 с хтмл
@
фронт, жидко пукнув, умирает
>приходит реальная 400 с хтмл
Нехуй дефолтные хендлы оставлять, это во первых.
Во вторых, нехуй без хэдера Accept запросы слать с клиента.
Не "поэтому", а потому что тебе влом как следует изучить HTTP и как настраивать свой фреймворк.
В целом похуй на тебя, делай что хочешь. Просто тебя с некоторой вероятностью нахуй пошлют, если ты по таким лекалам RESTful будешь делать, но камон, как будто первый раз где то кто-то лабает всратое не имеющее стандартов API. Как жили в дерьме, так и сдохнем в дерьме видимо...
>>35281
Куда уж дальше раскрывать.
https://developer.mozilla.org/ru/docs/Web/HTTP/Headers/Accept
Хедер есть такой в HTTP. Accept называется. Если ты реквест пошлешь с "Accept: application/json", сервер не пришлет тебе никакого HTML. Или JSON пришлет, или 415-й статус код, если MIME на сервере не поддердживается.
>Не "поэтому", а потому что тебе влом как следует изучить HTTP
какой http код отвечает за "отчёт не сведён"?
Я те вроде уже все сказал - делай что хочешь. Не нравится следовать RESTful - городи поверх HTTP свои правила, только не удивляйся что твое API ненавидят и нахуй шлют с такими инициативами. От меня тебе че еще надо? Те сказали что двухсотка на ошибки - не RESTful и не канон: что ты в ответ доказать то пытаешься? Что ты - хуи не сосал? Что RESTful нинужон? Что 200 - это ок но не всегда? Что?
>"отчёт не сведён"
Если запрос на сведение отчета был валиден и легитимен, но на сервере что-то не сошлось во время выполнения сведения, то 500. Если проблема была с запросом, то один из 4 кодов, в зависимости от того, что с запросом было не так.
https://restfulapi.net/http-status-codes/
>>35319
А ты не оставляй дефолтный формат. Делай свой раз дефолтный не подошел.
Более того, если ты все делаешь правильно, клиенту зачастую и не будет нужды лезть в боди. Если статус - 404, один хуй ясно что запрашиваемая клиентом сущность не найдена - зачем в боди то лезть? Или, если статус - 403, один хуй ясно что надо юзера редиректить на логин, или говорить что у него нет привилегий. Многое браузер за тебя сам сделает, например перепошлет запрос на новый location, если получит 302.
В этом и цимес стандартов - на HTTP много че подвязано и в браузерах, и в серверах, и в прочих узлах типа прокси или CDN. А вы берете и просто такие - "а, ебал я стандарты", и в итоге все заново переизобретаете. Или лабаете куцую хуйню которую потом другие люди заебутся интегрировать.
фронту надо сообщить что данная операция неуспешна по причине "бюджет не сведён". Какой http код отвечает за несведённый бюджет?
>Делай свой раз дефолтный не подошел.
так не я отвечаю. Между мной и клиентом 100500 посредников, и каждый может выдать хтмл/json заглушку. Ты почему-то ориентируешься только на успешный сценарий, когда всё везде работает
> Если статус - 404, один хуй ясно что запрашиваемая клиентом сущность не найдена - зачем в боди то лезть?
PUT /order/adress
404
оно относится к order, к adress, к неправильному урл или отсутствию приложухи на сервере?
>фронту надо сообщить что данная операция неуспешна по причине "бюджет не сведён". Какой http код отвечает за несведённый бюджет?
Ты тупишь чтоли, или я с нейронкой ебаной общаюсь щас? У тебя боди есть - вот там и сообщай что хотел клиенту. Только не со статусом 200, а со статусом 500.
>и каждый может выдать хтмл/json заглушку
Если ты шлешь Accept в реквесте, то они не имеют право слать тебе в ответ что-то другое. А если по факту шлют, значит - не правы, и должны быть пофикшены.
>PUT /order/adress - 404
Это троллинг тупостью чтоли? Ты PUTом ресурс запрашиваешь чтоли, чтобы оно тебе отвечало "The server can not find the requested resource", или что?
> У тебя боди есть - вот там и сообщай что хотел клиенту. Только не со статусом 200, а со статусом 500.
клиент читает боди при 500
@
приходит реальная 500 с заглушкой
@
фронт, жидко пёрнув, умирает
Дальше, проблема с мониторингом. Это не 500, это стандартная ситуация, не нужно никому сигнализировать и рисовать красные экраны. Как отличить штатное сообщение валидации и реальное падение?
>А если по факту шлют, значит - не правы, и должны быть пофикшены.
шлёт шлюз провайдера клиента
@
эй, сраный билайн, фикси свои сервера
>Это троллинг тупостью чтоли?
шлёшь
PUT /order/10/adress/20
body {newValue}
404 относится к ордеру, к адресу, к приложухе, или что ты урл неправильно сформировал?
>приходит реальная 500 с заглушкой
Третий раз тебе повторять одно и то же я не буду
>шлёт шлюз провайдера клиента
Либо ты кидаешь сейчас пруфы этого прецедента, либо ты пиздишь
>Выдумал априори бредовый не имеющий смысла ответ на абстрактный PUT в вакууме и спрашивает его семантику
Ты не шаришь, иди штудируй стандарты. Или не штудируй, мне похуй.
не. Content Type это сервер отсылает, обозначая тип данных. А Accept Header это клиент, типа я могу обрабатывать только такой формат. Но это совет, мало кто эти хедеры читает
Content-Type может быть еще и в реквесте, если этим реквестом ты через POST или PUT передаешь контент на сервер. По этому хедеру сервер будет судить - что ты ему передал.
если ты заведуешь ручкой - то ты эти хедеры и должен обрабатывать. Но проблема что если на сервере или на гейтвеях проблемы, то до ручки запрос не доходит, и там уж как реализованы все эти нгинксы и томкаты, хз читают ли они эти хедеры и умеют ли они отдавать заглушки в жсоне. Я вот сомневаюсь.
Ну вот присылает мне клиет с access'ом xml а мой эндпоинт отдает Json. В консоли я увижу что-то типо: Resolved: [Incorrect type],а клиент что увидит?
Чтобы отвечать на тупые вопросы, надо задать тупые вопросы. А выше по треду был только спор по рестфул душный какой то. Где твой тупой вопрос?
>мой эндпоинт отдает Json
Твой эндпойнт не просто отдаст джсон, он отдаст его с хедером Content-Type: application/json. По которому потребитель уже имеет шанс понять что пошло чето не так. Помимо этого есть хедер Server, и ты еще своих хедеров набашлять можешь для разных нужд.
Accept это только совет, ты можешь его игнорировать и вернуть в ответ хтмл. Полиция хедеров к тебе не приедет
Ну а спринг - не игнорирует.
Есть положняк под названием HTTP Content Negotiation, эти хедеры все - оттуда.
спринг это ты. Томкат тоже игнорирует. По поводу того что где-то там что-то написано - на заборе тоже много что написано
ну так двач буквально накодила обезьяна
Как в пизду совет,это же буквально метаинформация о запросе
В каком плане? Определение из java concurrency in practic. Если инструментально подходить, то база знаний, которую я сделоль, пока читал её.
Нет
>>на начальном этапе создания базы данных и
одна команда в консольке - docker run всякие параметры postgres
>>связывания ее с IDE запутался
На это секунд 15 трачу. Надо ж просто 4 строчки заполнить адрес/порт/логин/пароль. И test connection можно прожать.
>>Вам нравится такими вещами заниматься?
Код писать нравится. Это как медитация. Отдыхаешь от всякой дневной хуиты пока пишешь код.
Вот тебе пруфы
https://securepayments.sberbank.ru/wiki/doku.php/integration:api:rest:requests:register
Сбер шлет при ошибках 200, код ошибки в теле json ответа
Ну не может же сбер, айти компания номер один, ошибаться, верно?
Тупо конечно, но это стандартная практика в мире CMS-интеграторов, которые клепают 80% всех сайтиков, и нифига толком не могут в программирование, на них и ориентируется весь бизнес
А если это сайтик или приложуха, и им не интересно перебирать десяток кодов?
У них всего два варианта ответа: "ой, что-то пошло не так, попробуйте ещё раз" и "форма отправлена успешно".
Так что любой ответ они парсят и проверяют всего двумя условиями: если json не пустой и содержит флаг ошибки - выводим ошибку, иначе выводим успех
Писать код - это как слушать музыку, как полет, как серфинг или спуск на лыжах, захватывающе, восторг на грани со страхом.
Надоесть может, через много лет, но пока ты плывешь по волнам, в потоке, это охуенно. Иногда сложно, иногда легко, иногда с горочки со свистом, иногда филигранно обходишь сложное препятствие. Мозг все время работает, анализирует, выдает решения - ты чувствуешь как жизнь бьёт ключом. Эндорфины прут, тебе хорошо, ты все можешь. Ты летишь в неизвестность, в темноту, и не знаешь что оттуда на тебя вылетит, справишься ли ты. Но успех от решённых задач подбадривает и говорит о том что справишься - справился же с сотнями сложных проблем ранее, значит все говорит в пользу того что и новые тебе покорятся. Бесконечный подъем наверх, с каждым разом покоряет все более сложные высоты.
Пока ты активен и здоров, пока ты имеешь силы и возможности - разве может это надоесть?
Программирование становится не интересно только в болезни - тогда тебе плохо, у тебя нет ресурса думать, просто лежишь и слюни пускает, тебе уже не до программирования.
Градл хуядл.
Зачем видеокарта ? Процессора со встроенным видеоядром достаточно. Например ryzen 5 5500U.
>>Бога нет.
А ДНК само образовалось? А программка на материнке тоже может сама написаться от короткого замыкания?
>>Был был бог - джава не была бы таким говном.
Бог использует кватернарный код, а не бинарный как люди.
Как же всрато выглядит JPA Criteria Query после хибернейтовских запросов, это просто пиздец. Аж писать ничего не хочется, когда вспоминаешь, что придётся изучать эту нелепую махину с кучей оверхеда и какого-то одному JPA нужного кода, который мне половину метода засрёт и усложнит его чтение.
А ведь мог просто брать и писать запросы на хибернейтовских критериях. С ветерком и на чиле. И потом сидеть и спокойно читать эту лаконичную красоту. На кой хуй их задепрекейтили бляяяяять
Да, хибернейт выглядит очень всрато после няшного SQL.
чел это обе легаси залупы
Вотс. Просто зашел сказать.
Ключевое слово "тоже"
Когда-то учил PHP, но надолго меня не хватило, блевал каждый раз от одного вида. Вкатился в итоге в жабу ебаную.
Из-за таких как ты и не стали учить. Никакой синтаксический сахар и перспективы вката не окупят убитую психику от работы в команде с шарпистами ебаными.
Стоит и о другом задуматься. Нахуя шарпоблядям выращивать себе конкурентов? Что-то здесь явно не так.
Опыт работы в it компании? Даже врать не надо. Это все проблемы? По моему это всю it распространено.
Альберт Степанцев - автор курсов по РНР. Если бы такие классные курсы были по джаве, то может быть и на джаву ещё попытался. Но тут и курсов крутых нет и шансы вката минимальные.
Не знаю, я по кишочкам/докам/спекам лазаю. Вон, смотри в иммутабельной строке есть мутабельные поля.
как сделать так, чтобы при сохранении через jparepository, когда срабатывает save, ДО него вызвался мой код и изменил кое-что в сохраняемой сущности
я хочу сделать generalEntity с датой создания и модификации, от него все унаследовать и перехватывать сохранение. Есть способы лучше так сделать?
Когда надоест заниматься ерундой, то скачай курс Альберта и увидишь как он учит программированию. Я за пару недель так прокачался, как не смог за 4 года в универе.
>Когда надоест заниматься ерундой
Ерунда не ерунда, но ты подумай, почему в иммутабельном объекте, который дает ряд гарантий в многопотоке, есть мутабельные поля, которые перезаписываются.
А как же С++ или Phyton ммм ?!
в хибернейте есть хуки. PrePersist, PreCommit и так далее. Не помню как называются. И наследование - плохо
гугли @CreationTimestamp и @UpdateTimestamp
вот пример на яблоках:
class Polka{
Apple[][];
Polka(int cols, int rows){
this.Polka = new Apple[rows][cols];
// хуёво, так как Apple не может в правильный конструктор
// нужный Apple можно получить только от getApple()
}
}
}
делай как тебе нравится, в чем проблема?
Просто смирись с мыслью, что для в любых подобных задачах надо писать 100500 строк бойлерплейта. Здесь нет изящных и удобных решений в одну строку.
Могу ошибаться, но
Фабрика: https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Array.html#newInstance-java.lang.Class-int-
Получение: https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Array.html#get-java.lang.Object-int-
Можно легко переписать на подобное:
public static Object get(Object array, int... index) {
if (!array.getClass().isArray()) throw new IllegalArgumentException();
Object r = array;
for (int j : index) r = Array.get(array, j);
return r;
}
Единственное, здесь нет type-safe.
>// хуёво, так как Apple не может в правильный конструктор
О чем ты?
Делая new Apple[rows][cols], ты просто получаешь матрицу rows*cols с nullями. О каком конструкторе речь?
Смирись лучше ты с мыслью, что ты - бессмысленная затычка в жопе, у которой по существу идей нет, а спиздануть чето надо.
Хотя проще так как-то сделать:
public static <T> T get(T[] arr, int i) {
return arr;
}
public static <T> T get(T[][] arr, int i, int j) {
return arr[j];
}
Сомневаюсь, что где-то нужны большие массивы, хотя интересно можно ли как-то с помощью дженериков скалякать геттер произвольной dimensions. Впрочем не совсем понятно нафига это может понадобится.
Ну главная проблема коллекций, что project valhalla все еще где-то там, далеко. Так что примитивы пока что только в них храним. Или похуй уже?
Ваще не понял об чем ты? Какая главная проблема коллекций?
Если нужно пихнуть примитивы есть Autoboxing/Unboxing.
Ну это сколько места занимать будет? ~16 байт + примитив.
Так ещё на каждое изменение, инкремент скажем, надо анбоксинг-действие-боксинг.
Тут и перфоманс в том числе. Ряд оптимизаций жвм просто невозможен. Да и аллокации время занимают. Ну и а байты считать смешно, конечно. Из-за таких как ты жаба и считается монстром, что жрёт дохуя оперативы.
Типа, а хули нам используем LinkedList<Boolean>, норм тема.
>Из-за таких как ты жаба и считается монстром, что жрёт дохуя оперативы.
Среди пердунов и шовинистов каких то разве что. Эти удавятся за лишний байт в оперативе, хотя их душнина обходится кабанам в стотыщ миллионов раз дороже той доли оперативы, за который они воюют. Остальным - давно похуй, заворачивают гуишки в электрон и в ус не дуют.
Ты обьясни - че конкретно за прикол ты с этими ебаными яблоками то пытаешься сделать? Из твоего исходного мессага ж нихуя не понятно, но очень интересно.
>>36941
>Ты обьясни - че конкретно за прикол ты с этими ебаными яблоками то пытаешься сделать?
По ветке можно было понять, что это не мой пост. Я просто решение через рефлексию предложил. Ну и еще интересно стало, можно ли как-то type-safe сделать через женерики для произвольной размерности массива.
>Эти удавятся за лишний байт в оперативе
Ну я просто не считаю делать анбоксинг и боксинг, если этого можно избежать.
>Ну я просто не считаю делать анбоксинг и боксинг, если этого можно избежать.
Не, это понятно, просто я не понял откуда вообще взялся разговор о боксинге, когда в оригинальном вопросе вместо примитивов яблоки какие то блять.
Я скозал, что это главная проблема коллекций - невозможность нормально хранить примитивы. Жду проекта вальхала, когда там его допилят.
>Жду проекта вальхала, когда там его допилят.
Окей, подождем.
Так а яблоки че? Я чекнул твой солюшен с рефлексией, и все равно не врубаюсь ни в постановку проблемы, ни в смысл решения. Чел вроде бы создает массив, а ты наоборот getаешь. Как ты интерпретировал его шизофазию?
Ну как я понял, ему нужно массив любых размерностей через метод создавать. Т.е. не только длина может изменятся, но и размерность. Вот только хуй знает где это может понадобится.
Гет тут нужен, чтобы с таким объектом работать.
Я хз где ты это там увидел, конечно. Или ты - лютый психиатр, или кто то из нас поехавший.
Вообще, он там чето об инициализации массива бугуртил, что типа через фабрику нельзя (схуяли?). Конструктор у яблока вишь ли у него неправильный. Короче я ебал, не моего ума видимо загадка.
не, мне нужен двухмерный массив объектов, объекты нельзя создать конструктором (ихоняя api говорит, что от этого жопа треснет), а только через сторонний метод. так что Apples[][] apples = new Apples[rows][cols]() не прокатит. массив фиксированн по размеру и меняться никогда не будет, коллекция не нужна, от apples.get(row).get(col) вместо apples[row][col] у меня дёргается глаз.
>объекты нельзя создать конструктором
Яблочки низя создать без конструктора? Технически, и wrapped классы нельзя по ним, точнее не желательно. Не понимаю в чем проблема.
Что я делаю не так?
> apples = new Apple[rows][cols];
итить, а так можно было? блять, пойду по дереву вырезать. спасибо.
Ну как бы да. Массив - это отдельный объект, опосредованно связанный с классом, который он определяет. Я тебе еще по интегеру это же сказал. Удачи там.
640 килобайт хватит всем
>Apples[][] apples = new Apples[rows][cols]()
Чел, нет такой конструкции как Apples[][] apples = new Apples[rows][cols](), откуда ты это взял вообще?
Массив создается или так: тип[] a = new тип[размер] и ты получаешь массив дефолтных значений типа (для референсных типов это всегда null)
или так: тип[] a = new тип[] { значение, значение2, значение3 }, и ты получаешь массив из трех значения типа тип.
Создавай массив первым способом, проходись по нему циклом и инициализируй чем хочешь.
Попробуй.
Когда я имел секс с нативной грааль сборкой, сначала была ебля с конфигами reflection metadata. Потом - похожая ебля с Unsafe. Лично я сдался, когда мне попалась зависимость с JNI вставками. В твоем случае спринг может быть сделал многие вещи за тебя из коробки. А может и не сделал, лол.
MinGW
Все так, бро
Сам на php много лет зарабатывал, теперь перекатываюсь в java
В разработке php частенько не хватало строгости java
Со временем сложилось понимание, что на php ничего нормального в принципе не построить
Язык поощряет срезать углы и говнокодить, что и обрекает любой сложный проект на смерть
В одно лицо крупные проекты не пилятся, а нормальную команду на php собрать вообще нереально: с одной стороны язык поощряет говнокод, шанс найти нормального программера на php мал, с другой стороны php выбирают чтобы максимально сэкономить на разработке, так что бюджеты на команды маленькие, что тоже не способствует найму профи
Типичная php-команда: недосенька, который все тащит, несколько типа "мидлов", и пучок "крепких джунов", которые не знают даже базы и по всем стандартам могут тянуть только на стажеров. Из всех них программером можно обозвать сеньку, и то с натяжкой - зачастую и у него с базой непорядок
Также php серьезно губят cms: 80% вакансий под программером понимают некого студента, который будет натягивать шаблоны на cms, и не более. Самим же программерам с cms связываться никакого резона: опыт подобной копрофилии им вообще нигде не пригодится
Вот и получается что на php работы много, но по большей части она низкооплачиваемая и низкоквалифицированная
На java пока напрягает только разговоры о том, что нет фриланса и удаленки - это было бы печально, от удаленки и той свободы что она дает отказываться не хотелось бы
>Типичная php-команда: недосенька, который все тащит, несколько типа "мидлов", и пучок "крепких джунов", которые не знают даже базы и по всем стандартам могут тянуть только на стажеров. Из всех них программером можно обозвать сеньку, и то с натяжкой - зачастую и у него с базой непорядок
У меня так же выглядит команда на 10 жавистов в небольшой галере.
>На java пока напрягает только разговоры о том, что нет фриланса и удаленки
фриланса считай нет, удаленка есть, хотя наверно поменьше чем на пыхе. И ее срезают всякие параноики из крупняка. Или режут вообще или переводят на гибрид. Или не разрешают удаленку из других стран или из других городов.
Стораюсь...
Многие бывшие однокурсники сидят на жабе спокойно и в хуй не дуют на 200к зп. Хуй знает, наверно тоже надо было в жабу идти, жаль 2 года на другой стек проебал.
Бч.
Егорыч любил XML тащемто.
Есть проблема - Connection timeout.
Когда происходит общение наших сервисов в кластере то у них стоит дефолтный таймаут в 1 минуту, после чего он падает с 504. Я использую HTTPInterfaces в спринге и потому в конфиг добавил:
HttpServiceProxyFactory httpServiceProxyFactory =
HttpServiceProxyFactory.builder(WebClientAdapter.forClient(searchASTWebClient))
.blockTimeout(Duration.ofMinutes(2))
.build();
Что в принципе везде советуют и при локальном тестировании всё нормально, соединение живёт 2 минуты вместо дефолтной 1 и потом падает. Однако на деве, на кластере, оно всё равно живёт 1 минуту. Мне девопс указывает что ошибка на моей стороне, потому что в логах выдаёт:
org.springframework.web.reactive.function.client.WebClientResponseException$GatewayTimeout: 504 Gateway Timeout from POST http://(тут линк на апи в кластере). Однако, я подозреваю, что проблема в кластере, он сам рубит соединение и потому вебклаент так же падает. Опять же, проблему локально я не могу повторить, потому что её просто нет.
Вопрос, как мне разобраться в чем проблема? Действительно ли это на k8 кластере у спринга отваливается конфиг прокси?
Ты чекни с девопсом - может между клиентом и сервером на проде есть прокся какая то ебаная, которая рвет коннекшен через минуту вопреки всему по своей инициативе. Например, чекни что в хедере Server у респонза с 504 приходит.
У меня такая же петрушка помню была, из-за чего весь отдел с ума сошел. Кастомерская бага была на то, что "севис отвечает чет медленно, тормозит", а на самом деле бэк сервиса лег под нагрузкой нахуй, а прокся между сервисом и клиентом обрывала коннекшен по таймауту с 504м статусом, который фронтенд тупо саппресил, создавая иллюзию что "все ок". Прикинь мое ебало в тот момент, когда я это нашел?
Тонны нефти, пиздос заебался уже какой день искать в чем проблема. Server действительно прилетает awselb/2.0, сейчас пойду указывать на это.
>Прикинь мое ебало в тот момент
Да у меня такое же будет, если не разберусь и придётся помидоров из других отделов звать, а проёб моим будет
Не торопись, проведи пару тестов. Например, чекни какой респонз вернется если сервер по своей инициативе в таймаут свалится. Выстави ему 30 сек и так же чекни хедер. А то те не поверят и нахуй пошлют.
Мне мои тоже не сразу поверили.
Понял, принял, сам до этого чет не додумал. Чая, нефти и девственниц.
В смысле? В java-разработке просто тонны xml. Это и конфиги, и выгрузки, и даже, блджад, апишки xml-шные.
Ты этот xml в страшных снах будешь видеть
Нету вакансий блинский
Meh. Ты преувеличиваешь. Где раньше был XML, давно уже завезли альтернативы. Ну вот назови хоть один XMLник помимо помника мавеновского, с которым ты имел дело последние пару лет?
P.S. - шаблон строитель это класс с приватным конструктором и статическим вложенным классом с названием Builder и он содержит статический метод build.
java.util.regex.Pattern типа. Но я не шарю, я даже не вкатун пока что, может там и другая хуйня.
Не зацикливайся на том, куда его нужно воткнуть, это априори хуевая постановка вопроса. Ответ на него не даст тебе никакого удовлетворения.
Просто знай что есть вот такой вот паттерн и его можно применять для сборки сложного обьекта.
Спасибо.
1. Конфиги на XML, да. Сервер приложений другое не умеет.
2. Пом.хмл, немного анта.
3. Клиент на Delphi работает через SOAP
4. В интеграциях тот же SOAP и кастомные ХМЛ-сообщения, хотя там частично перелезли на кафку с жсоном. Но есть и кафка с ХМЛ, прости господи.
А ты ?
Ну я вроде не работаю на серверах приложений, стек более-менее свежий.
Ликвибейс, жук-кодген, логеры всякие. Интеграции на хмлях с кучей древних внутренних и менее древних внешних сервисах. На соапе, ресте, реббите.
В спринге хмл видел 2 года назад на проекте, который тогда выл 10-летним легаси. На хибере не видел никогда.
В среднем с yml и json я работаю даже чаще чем с xml.
>Ликвибейс
Поддерживает миграции ямлем и джсоном
>жук-кодген, логеры всякие
Ну допустим
>На соапе
Ок
>ресте
А здесь че? Опенапи генераторы спокойно поддерживают и джсон и ямль спеки
>реббите
Реббитовский конфиг с эксченджами? Джсон. Или про какой хмл ты тут?
>В среднем с yml и json я работаю даже чаще чем с xml.
Ну видишь? А говорил "тонны хмл в джава-разработке".
И в чем преимущество перед конструктором? Типо не надо делать 100500 методов для каждой вариации? Хотя по итогу все равно все к нему сводится... Нахуя это надо?
>Опенапи генераторы
Это нерабочее говно, которым никто толком не пользуется. Проще руками написать клиент и контроллеры на сервере, чем месяцами дрочиться с генератором, который раз за разом высирает говно. А контракт можно зафиксировать несколькими сообщениями в чате. Все!
Неистово плюсую, еще это говно ломается с обновлениями спринга например
чем он вам не нравится? Простейший читаемый логичный формат. Уж явно лучше ямла
когда не хочешь делать конструктор на 100500 полей, при этом часть полей может быть необязательными. Тогда применяешь билдер
>Проще руками написать клиент и контроллеры на сервере, чем месяцами дрочиться с генератором
Да ради бога. Только вот один хер ресты ты будешь руками писать скорее всего аннотациями. О каких XMLках идет речь рыше - вопрос по прежнему открытый.
Предположим у меня есть программа, которая считывает из памяти другой программы данные. Как мне передать их в жава приложение так, чтоб не писать на диск, а сразу, из памяти в память?
Сокеты.
COM ACTIVEX OLE
>способы общения процессов
Это все называется и гуглится по термину - Inter-Process Communication (или IPC)
>Как мне передать их в жава приложение так, чтоб не писать на диск, а сразу, из памяти в память?
Сокеты, пайпы. В теории максимальбно близкий по твоему описанию IPC - это shared memory, но в джаве оно не поддерживается (и это - к лучшему, на самом деле). Также, не спеши по критерию "Чтоб не писать на диск" отсеивать файлы как таковые - в юниксах многие вещи в виде файлов существуют, например, именованные каналы.
В дотнете не делают библиотеки, там хрючат что майки дадут или ждут сдк под шарп от джавовых либ и тулзов
Какой же ты рациональный и рассудительный человек.
Кому как нравится.
Можно ещё сделать веб-приложение на spring и отсылать туда данные с памяти с get/post запросом. Spring будет с помощью модели отдавать эти данные на веб-страницу, а затем другое приложение будет читать их оттуда из url.
Есть сайт какой-нибудь, чтобы там написано было?
Вот сейчас добавил в проект Hibernate-core зависимость версии 6.2.5 Final (то есть последнюю) - и в web.xml файле в строках
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
dialect.MySQLDialect красным горит, не находит зависимость.
В pom файле поменял зависимость на 5.4.22.Final (как в уроке) - все заработало, хотя другие зависимости самые последние.
Как это работает и от чего зависит?
Я бы хотел как можно меньше посредников. Вообще жава оказывается умеет по средствам винды инжектить длл в процессы, создается поток и туда длл пихается. Я тут подумал, а нельзя ли как нибудь не хранить на диске длл для инжекта? Ну типа мы уже можем создавать пустой поток в процессе, а как нам залить сразу в это адресное пространство байтики, которые мы заранее храним в памяти нашей программы?
>Как узнать какая зависимость в pom-файле к какой зависимости подходит?
>Есть сайт какой-нибудь, чтобы там написано было?
Этого нет ни в джаве, ни где либо еще. Реальная совместимость версий зависит тупо от дисциплины людей, разрабатывающих компоненты.
Есть semver. Есть релиз-родмап тех же спринга и хибернейта, где декларируется кто с кем совместим в теории. А дальше все зависит от того, кто где обьебался.
>dialect.MySQLDialect красным горит, не находит зависимость.
Мало ли из-за чего идея красным горит... Может это баг в идее. Может идея индексы не обновила? Не думал об этом?
Кубер - сервер приложений.
Ну смотри как это делается в железе:
выделяется общий буфер, выделяется счётчик, и выделяется прерывание.
Железка снаружи пишет данные в буфер, пишет длину данных в счётчик, и дёргает за прерывание.
По прерыванию просыпается друга железка или драйвер, смотрят на счётчик, забирают данные из буфера, засыпают.
В твоём случае общий буфер - это обычный файл, например в /tmp, проще некуда, и не на диске
Счётчик - заголовок файла заранее известной длины
Прерывание - сигнал, который посылаешь процессу
И вот уже простейший конвеер готов
Если нужно не просто передавать, а двигать окно - тут уже потребуется двусторонняя связь и драйвер.
На низкоуровневой стороне пишешь логику драйвера: он должен принимать смещение, размер окна, ссылку на буфер, и отдавать позицию окна, размер доступной области памяти и размер считанных в буфер данных.
На высокоуровневой пишешь ответную часть драйвера: выделение буфера, считывание размера блока памяти и позиции окна в ней, управление смещением и размером окна, вычитывание буфера.
Через этот драйвер получаешь почти прозрачный маппинг внешней памяти внутри java, и обрабатываешь в java как угодно
Если очень хочется, можно даже буфер записи организовать, чтобы не только читать, но и писать
Для меня это хедеры.
Лепить класс со статик методом и потом вызывать его через int value = DiceUtil.roll(6) не хочется, потому что егорка сказал, что статик методы это плохо.
Насколько лучше сделать так: int value = new Dice(6).roll() и повторять этот код во всех местах где нужен бросок? Без инъекции кубиков через конструктор/сеттер, потому что мне не нужно тестировать взаимодействие вызывающего кода с кубиком. Пока.
Выглядит однохуйственно, честно говоря.
А этот твой егорка не сказал, что new это гораздо хуже, и чем чаще вызывается, тем больше?
Окей, ты предлагаешь сделать очередной спринговый залупа сервис, кидающий дайсы. Но у меня пет для души, без спринга, без энтерпрайз кала...
Ну так и сделай diceutil и не еби мозги
>в не спринговом приложении
А как бы поменялась логика, если б ты спринг юзал?
Вроде все генераторы рандома делаются статическими или получаются через статический метод по типу ThreadLocalRandom#current(). Поэтому почему бы не сделать фабрику? Притом new будет очень плохо, тк создание условного SecureRandom долго...
>А как бы поменялась логика, если б ты спринг юзал
Сделал бы залупа сервис синглтон, как обычно
Благодаря спрингу мне не надо руками прокидывать дайс во все коллабораторы в мире и я получаю удобную возможность тестировать, что 1) подкидывание кубика реально работает 2) код, который работает с кубиком, кидает его с нужным числом граней. Объект остается объектом, а не утил методом
>Вроде все генераторы рандома делаются статическими или получаются через статический метод по типу
На самом деле помимо этого специфического примера постоянно возникает необходимость писать микрологику, которую некуда приткнуть, кроме как в утил классы.
>1) подкидывание кубика реально работает 2) код, который работает с кубиком, кидает его с нужным числом граней.
Ты рофлишь? Вот этот вот код тестировать? Ебать тебе заняться нечем. Ну к слову, я б хотел увидеть, как ты рандом-то тестируешь.
>На самом деле
На самом деле я б на логику посмотрел. И вообще через инъекцию бы сделал. По моему она лучше всех выглядит... Впрочем кто я, а кто ты.
new RolledDice(new Dice())
>Ты рофлишь? Вот этот вот код тестировать? Ебать тебе заняться нечем.
Сам рандом не стал бы, но коллаборатора потестил бы. Когда он начнет выбирать количество граней динамически.
Нигде, это я так называю класс, который взаимодействует с тестируемым кодом. Что, раскусил меня по сленгу? Да, я вкатун.
>коллаборатора потестил бы
>класс, взаимодействует с тестируемым кодом
Какое-то масло масляное получается.
Так-то если у тебя несколько дайсов, там не знаю аналог днд, то лучше делать не через Util класс. Да и каждый раз создавать новый кубик для броска как-то не логично.
А сама инкапсулированная микрологика, вроде и не плохо. Вон помню наебался с свингом и масштабированием шрифтов. Насколько я сейчас понимаю, всем абсолютно срать на них и есть спец пункт в менюшке, где пользователь сам настраивает размер шрифта.
>Да, я вкатун.
Ты-то судя по всему хотя б вкатился.
>Насколько лучше сделать так: int value = new Dice(6).roll() и повторять этот код во всех местах где нужен бросок?
Делая так, ты приколачиваешь все места в коде к одной имплементации "кубик"
>Без инъекции кубиков через конструктор/сеттер, потому что мне не нужно тестировать взаимодействие вызывающего кода с кубиком. Пока.
Никаких "пока", и прочих виляний жоп.
Ты либо скаплен, либо не скаплен, от твоих намерений по тестингу тут ничего не зависит. Если ты скаплен на конкретику (типа конкретной имплементации) - это всегда хуже чем если бы ты был не скаплен или скаплен на абстракцию (интерфейс "кубик"). Если тебе похуй, то тебе похуй. Но твой похуизм не оправдание и не переменная в уравнении "поддерживаемость" - ты просто получаешь закладку, которая тебе стрельнет если тестить ты таки намылишься (или стрельнет еще по каким нибудь будущим причинам).
Если тебе с этим ок - дерзай.
Куда?
Чел ты уже ему должен за то, что он тебе уделил время в ответах.
Дайте ссылку пожалуйста.
Бляяя опять ты
>магистерские лекции по java на русском
Эт как? И чем лучше те, кто просидел кучу времени в проституте, от практиков?
Так джава это второй курс бакалавриата. Причем тут магистерские?
int parsed = try Integer.parseInt(colorString, 16)
___________or 0;
Есть, гофер ебаный.
int parsed;
try {
parsed = Integer.parseInt(colorString, 16);
} catch (Exception e) {
parsed = 0;
}
Одна же:
int parsed; try {parsed = Integer.parseInt(colorString, 16);} catch (Exception e) {parsed = 0;}
>проверить формат отдельным вызовом
По моему его нет в Integer. Ну т.е. вот она, проверка. Самому писать, ну ты че, скока это ж строк-то!
Зато самому писать не надо аж 6 строк.
Что думаете насчёт курсов яндекса и проч. Альтернативы изучения прогерства?
Чел писал в мануале на этой борде, что курсы хуита и лучше делать "както" самому, что вы думаете по этому поводу?
Если курсы хуита, то какая адекватная альтернатива?(дайте плиз инфу), либо...., пойду дальше изучать эти курсы совместно с изучением книжек(половина содержания которых абстрактны, наверное, так и должно быть)
Сори за кашу
курсы не хуита, но лучше о них не говорить
Курсы хуйта
Реальная альтернатива - реально учить программирование, а не заниматься всем, кроме самого программирования
Просто блять садишься и пишешь ебучие калькуляторы и прочую хуйню, ВСЕ
>>будет тебе одна строка.
Автоформатер сделает 6 строк
>>Хорошая практика - сначала проверить
Эта практика из 15-х. Щас в джаве такую хуйню лучше не писать.
По отзывам коллег скажу - что курсы не совсем хуита. Если от программизма не фанатеешь и не шибко умен - то курсы норм. Подучат на джуна, можно даже мидлом стать и получать свою сотьгу.
Как правило курсы для вкатунов - низкого качества. Я вообще не уверен что физически возможно создать хороший курс для современных вкатунов, честно говоря.
Неплохие курсы есть для миддлов-синьоров по какой нибудь низкоуровневой специфике или архитектуре, но это - лотерея.
Вообще, хороший курс - курс с обратной связью, когда тебе литералли доступен канал связи, куда ты можешь задавать любые свои вопросы людям и получать на них ответы. Если уж связываться с курсами, то только с теми, где она есть. Иногда обратную связь продают как опцию, и вот без обратной связи даже хороший курс становится пустой тратой времени.
В самой джаве нет, но в либах есть, например Try в vavr'е.
А какую лучше писать?
Та блин, думаешь я стал бы задавать вопрос, если б мне было не лень...?
Забей, в жабе не применяют DDD.
Ну смотри сам
Сам я вкатился после двух месяцев самообразования и успешного тестового и интервью
Потом проходил курсы
Один проходил три года, так и не прошел, забросил
Второй проходил полгода, забросил
Третий прохожу два года, из них год хуи пинаю
Если бы я перед поиском работы проходил бы курсы - был бы до сих пор без работы
То что на этих курсах преподают, на работе освоил за полгода-год самостоятельно
Я сам доплачиваю
У нас их 5. Двое из них меня активно уберают как reviewerа. Как это блять понемать? Мне их начинать чмэрить потехоньку?
Не, ну тут уже не чмырить. Тут тока пиздить.
Его по знакомству взяли.
Да, фигня всякая
Написать сервис для бронирования билетов в кинотеатр кажется
Бек, фронт, апи, миграции
Простенькая админка, каталог доступных позиций, личный кабинет, список заказов
Уровень исполнения любой, никаких требований, хоть из говна и палок
Важно показать, что в принципе способен решить задачу
В любом случае на месте дообучают до требуемого уровня
Ну а если можешь чего - по коду будет понятно: какие технологии использовал, насколько легко задача далась, что вообще умеешь
Тутошние мидлы такое за 4 часа накидают. У меня ушла неделя.
За код стыдно конечно, сейчас понимаю что там трешак был. Но и пофиг - все равно взяли.
> Курсы хуйта
> Просто блять садишься и пишешь ебучие калькуляторы и прочую хуйню, ВСЕ
Вот это самый толковый совет
Но это больно: проблемы на всех этапах.
Сложно выбрать что конкретно хочешь написать. Но сейчас есть всякие рулетки тем, и прикладные проблемы никуда не делись, которые можно решить прям сейчас с помощью простенького кода.
Сложно решать возникающие проблемы: как конкретно решать задачу, что использовать, как разбить? Но сейчас есть чатики - всегда можно спросить совета.
По первости сложно гуглить: непонятно как вопрос сформулировать, что вообще искать. Но с опытом это быстро проходит.
В общем вариант через боль, но очень быстро прогрессируешь, потому что прямо на практике сталкиваешься с проблемами и сам их решаешь - такой опыт потом фиг забудешь.
А в чем проблема? Наоборот хорошо, на два потока говнокода меньше.
Ты же не мерджишь этот код.
Ищи курсы с менторингом как у Сергея Немчинского
На Хабре и много где тоже очень многие не любят хибернейт.
Просто вместо обсирания хибера мог бы сказать что любишь и чем оно лучше хибера. Но хибер это дефолт. На 90% вакух на спринг крудах есть хибер и ради тебя его никто не уберет. Поэтому его нужно знать.
Не совсем понятно откуда черпать теорию и в каком порядке её проходить? Я читаю док спринга но это залупа, порой несвязная и непонятно что описывается.
Хотелось бы воспользоваться вниманием и спросить чем лучше связать бэкенд с фронтом для такой практики?
Начни с http - там все есть для связывания бека с фронтом
Если ты можешь связать бек с фронтом без фреймворка, то ты понимаешь как это работает и всегда докопаешься до истины в случае проблем
Если же ты научишься работать только через фреймворк, то любой шаг в сторону - и у тебя большие проблемы
http это же сахарок. Тогда пусть на сокетах
>Хорошая практика - сначала проверить формат отдельным вызовом, а не тупо глотать ошибку и подставлять дефолтное значение, как в пыхоплеяде.
Я бы срал достью, но у меня есть древняя база данных, в которой появляется вот такое говно периодически.
С такими данными в любом случае придётся Сра дать и писать костыли, какой бы в языке ни был синтаксический сахар.
>откуда черпать теорию и в каком порядке её проходить? Я читаю док спринга но это залупа, порой несвязная и непонятно что описывается.
Алишев на ютубе
spring otus на nnmclub.to
Для начала за глаза. Остальное, по мере надобности более узкоспециализированное - просто на стековерфлоу, по баелдунгу, отдельным статьям на медиуме, в доке и в сорцах фреймворков.
Например развивается шиза и ты хочешь переписать индустриальные стандарты на велосипед из матрешек конструторов.
Как вы могли просрать такое кошерное руководство, как это:
https://eightm.github.io/JavaBackendStartGuide/
Ммм?
Просто мы можем думать своими мозгами вместо чтения ноунейм гайдов.
Да вы заебали. Вам минусуют зп что ли за эти ебучие строчки?
В процессинге есть класс PShape, через конструктор рабочий экземпляр не создать (наверно можно, но будет бессмысленная хрень). Объекты PShape можно получать от фабрики createShape(). Она как надо настроит и всё что нужно соберёт и подтянет. Проблема в том, что вся оболочка processing настроена так, что многое не явно. Вот допустим самих этих фабрик createShape() в сорцах процессинга хуева туча и я не знаю, которую дёргает IDE.
Мне же нужен мой собственный и любимый PShape с маленькими дополнительными фишками (пара дополнительных полей и методов). Наследование не вариант. Я думаю, что возможно есть два выхода из ситуации:
1) кастовать готовый PShape на myPShape, но я без понятия, возможно ли такое вообще. Наверно нет, полей, которых в PShape не было, это же не добавит.
2) инжектить поля и методы в экземпляр. Это мне кажется возможным.
Так вот, как в жабе в экземпляр класса инжектить произвольное поле или метод в рантайме?
Съебал нахуй.
Тогда засунь декорируемый объект в груви класс и поставь над ним @Delegate. Дальше пиши свои методы.
Просто подключи ломбок
Просто выключи гит плагин, он говно
Хуево обосновал значит. Ну вот че это за хуйня?
>Что его нельзя "настроить"
>Что там постоянно надо бороться с какими-то проблемами
Это эмоции, а не аргументация. Я б тя тоже послал после такого, при этом я - функциональщик.
Запомните, дети - избегайте на собесе тем-вкусовщин. А если вам такая тема все же перепала, вступайте в полемику только тогда, когда вы - маэстро обьективного ризонинга со стажем 10+, съевший пуд соли на сабже, которому наступили на больную мозоль. В противном случае, будьте как тот попугай из анекдота и говорите "зависит от контекста". Иначе оно вас сожрет нахуй. Интервьюер всегда в более выигрышной позиции в таких темах.
>и я не знаю, которую дёргает IDE.
У тебя IDE чтоли процессинг дергает? Или ты - чатгпт не вывозящий тьюринг тест?
Ты ебанину невнятную какую то написал, а не вопрос. Что за фабрики? Почему их много? Почему это проблема? Что такое твой собственный PShape? Ты новую имплементацию написал или старую проапдейтил? В чем проблема вместе с парой доп полей проапдейтить и фабрики? При чем тут инжекция? У тебя спринг чтоли PShape создает? Тогда нахуя фабрики?
Короче ты не вывезешь эту задачу, тебе явно не хватает экспертизы даже тупо чтобы вести с тредом внятный диалог.
ТУПОВАТЫЙ ДЖАВИСТ
ПОЧИТАВ ИНТЕРНЕТ
ПOДРOЧИЛ СВОЙ ОТРОСТОК
И СКАЗАЛ ИДЕЕ НЕТ
ТЫ ТУПАЯ СКОТИНА!!
ТЫ ПОДОНОК ТУПОЙ!!
О РАЗРАБАХ, БЛЯДИHA
ПОДНЯЛ ГРОМКИЙ ВОЙ!!
ТИПА РУССКИЕ КОДЕРЫ
УБИВАЮТ АЙТИ!
СОВЕРШЕННО СПОКОЙНО
КРОШАТ ПРОД И ГИТХАБ!
МАЛОЛЕТНИЙ ПОДОНОК!!!!!!
ЗА БАЗАР ОТВЕЧАЙ!!!!!!
ГРЯЗНЫЙ ГЛУПЫЙ УEБOK!!!!!!
ПИЗДЮЛEЙ ПОЛУЧАЙ!!!
Я EБAЛ ТЕБЯ В ЖOПУ!!!!!!
Я СОВАЛ ТЕБЕ В РОТ!!!!
ЧТОБЫ ТЫ НЕДОНОСОК!!!!!!
НЕ ПОЗОРИЛ НАРОД!!!!!
ТЫ НА СИШАРПЫ УЕДЕШЬ!
МАЛОЛЕТНИЙ УРОД!
ПО ЭТАПУ ПОЕДЕШЬ
ЗА ВРАНЬЕ ПРО НАРОД!!!!
ТУПОВАТЫЙ ДЖАВИСТ
ПОЧИТАВ ИНТЕРНЕТ
ПOДРOЧИЛ СВОЙ ОТРОСТОК
И СКАЗАЛ ИДЕЕ НЕТ
ТЫ ТУПАЯ СКОТИНА!!
ТЫ ПОДОНОК ТУПОЙ!!
О РАЗРАБАХ, БЛЯДИHA
ПОДНЯЛ ГРОМКИЙ ВОЙ!!
ТИПА РУССКИЕ КОДЕРЫ
УБИВАЮТ АЙТИ!
СОВЕРШЕННО СПОКОЙНО
КРОШАТ ПРОД И ГИТХАБ!
МАЛОЛЕТНИЙ ПОДОНОК!!!!!!
ЗА БАЗАР ОТВЕЧАЙ!!!!!!
ГРЯЗНЫЙ ГЛУПЫЙ УEБOK!!!!!!
ПИЗДЮЛEЙ ПОЛУЧАЙ!!!
Я EБAЛ ТЕБЯ В ЖOПУ!!!!!!
Я СОВАЛ ТЕБЕ В РОТ!!!!
ЧТОБЫ ТЫ НЕДОНОСОК!!!!!!
НЕ ПОЗОРИЛ НАРОД!!!!!
ТЫ НА СИШАРПЫ УЕДЕШЬ!
МАЛОЛЕТНИЙ УРОД!
ПО ЭТАПУ ПОЕДЕШЬ
ЗА ВРАНЬЕ ПРО НАРОД!!!!
Да и жизнь свою тоже
Таблетки
Только не на сишарп!
Но с другой стороны сейчас на проекте активно использую сервисы, которые обновляют состояние системы и возвращают список случившихся событий:
List<DomainEvent> events = domainService.doStuff(...)
...
(разослать эвенты подписчикам)
Подсмотрел такое решение в книге Microservices Patterns with examples on Java.
И это прям супер удобно пока, какие могут быть подводные камни?
Нужна ли матеша для бэкенда?
Конкретную математику читал? Ну или хотя бы исхуйство пограмирования?
Че да лол
Почти везде достаточно школьной программы: арифметика
Матан нужен там, где есть исследования, да и там зачастую этот матан курят всякие аналитики бигдаты
От программиста не требуется что-то там исследовать, выводить закономерности и прочее, это задача профильных матанщиков
А смысл те колупаться с возвращаемым листом, вместо того, чтобы разослать сообщения прям в void-методе и не открывать коллерам лишних деталей о его имплементации? Что тебе дает этот List<DomainEvent>?
бамп
>какие могут быть подводные камни?
Если ты делаешь рассылку внутри метода, ты не можешь, вызвав метод, обновить состояние и никого об этом не уведомить.
В твоем же случае ты вернул список эвентов коллеру, а коллер возьмет и хуй забьет, и никуда их не отправит. Будешь потом искать по всей системе, где забыл сообщения разослать.
Пытается в троллинг тупостью.
Если я правильно понял, то у него аналог https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html .
Ты описываешь ситуацию, мол подписался на событие, а тебя проигнорили? Хотя в случае EDT однопоток и любое долговычислимое событие просто все застопорит. И еще нельзя делать сайд эффекты вне этого треда... Но то гуем объясняется, мб тут иначе.
Есть какая-то конкретная реализация того, что он описал? Почитать бы...
Какие еще EDT? Он говорит что спиздил решение из книги о микрсервисах, а микросервисы - уже априори не однопоток.
Да и даже если б был EDT - то с хуяли однопоток? Мы не в джаваскрипте. Кто тебе мешает насоздавать тредов для обработки эвентов в них?
>а микросервисы - уже априори не однопоток.
Т.е. там ThreadPool<Event>? Интересно, а конкретную реализацию можно?
>Да и даже если б был EDT - то с хуяли однопоток?
All other Swing component methods must be invoked from the event dispatch thread. Programs that ignore this rule may function correctly most of the time, but are subject to unpredictable errors that are difficult to reproduce.
Если паралелилить надо просовывать сайды в EDT, SwingUtils.invoke типо того. А внутри EDT только один тред, который последовательно вызывает event, поэтому он однопоток.
>там ThreadPool<Event>?
Когда микросервисов больше, чем один, тредов тоже априори больше, чем один. По одному на процесс как минимум. Это во первых. А во вторых, да - обработка эвентов в современных фреймворках обыно происходит в тред пулах.
>Интересно, а конкретную реализацию можно?
Нет
>All other Swing component methods must be invoked from the event dispatch thread
И че? Тут всего лишь сказано что ты не можешь свинговые компоненты в многопотоке шатать, потому что они не тредобезопасные. Где тут сказано что нельзя эвенты обрабатывать асинхронно?
Ты всегда можешь тяжелую часть обработчика вынести в пул, и по окончанию обработки кидать обратно в диспатчер тред новы эвент, чтобы по нему уже обновлять UI. Типичный callback-подход к асинхронщине.
>происходит в тред пулах.
Т.е. весь фреймворк тредобезопасен? Заебно, наверное.
Мне только непонятна разница между EDT и его обработкой эвентов. Вроде тоже самое, правда он зачем-то возвращает лист, нахуя...
>Нет
Жадина.
Сап, крч, ищу себе новую работу, бэкграунд 3.5 года Full-Stack Developer (.NET+JS) и щас почти 2 года Unity Developer, щитай middle+, но пытаюсь прорваться в senior.
Тяжело по вакансиям здесь, но вот одна подцепилась, дали тестовое, вроде норм, но тут одна херня выскочила, они хотят, чтобы у тебя было 3+ лет опыта в качестве мобильного разраба (Android/iOS), резюме посмотрели, сказали что типа вы нас заинтересовали, но прикол в том, что таску какую они дали, там Clean Architecture, я не знал что это такое, сказал что знаю, ибо думал стандартная хуйня в виде стандартных практик, которые знаю и имею опыт. А ОКАЗЫВАЕТСЯ, ЭТО АНДРОИДОВСКАЯ ДЖАВИСТКАЯ ХУИТА, в .NET такой хуйни нет, особенно в юнити ни разу блять не видел. Посмотрел примеры реализации этой хуйни в .NET, а там блять нахуй src/, сук, это из ебаной джавы блять, какого хуя блять в Unity, в C#, потерялась джава, ебать.
Джависты, ебать помогите пидоры че делать? Слать сразу нахуй вакансию? Сделать стандартным способом? Или пытаться пилить вашу Clean Architecture из говна и палок?
>Т.е. весь фреймворк тредобезопасен? Заебно, наверное.
Да не.
Проблемы тредобезопасности возникают только тогда, когда из нескольких тредов есть конкуррентный доступ к общим данным. Если общих данных нет (либо есть но в лице какой нибудь базы данных которая всю синхронизацию доступа к табличкам за тебя делает), проблемы потокобезопасности впринципе не существует. А в микросервисах большая часть данных обычно - часть какой нить базы данных.
>Мне только непонятна разница между EDT и его обработкой эвентов. Вроде тоже самое, правда он зачем-то возвращает лист, нахуя
Не знаю как тебе, а мне вот например непонятно, с чего ты вообще заговорил про EDT в контексте того разговора? EDT ничего никуда никакой лист не возвращает. EDT в свинге это просто тред, который в бесконечном цикле читает и обрабатывает сообщения из некоей очереди сообщений, вот и все.
>с чего ты вообще заговорил
Хочу понять разницу. Нахуя вовзращать лист? Типо без него, это банальный Executor.
Ебать ты всех джавистов затролил дядь-бобой, мое почтение. Какой ты остроумный, я ебал.
Съебал нахуй.
Спрашивай в треде про Андроид >>2678699 (OP)
Здесь одни Spring-программисты сидят и ни про какую КлинАрхитектуру не слышали.
Хуле тебе в дотнете не сидится, а?
>Нахуя вовзращать лист?
Дык нинахуя. Я с самого начала так и ответил. Плюсов не прослеживается.
Спасибо ♥
processing это такой язык. по сути это жаба и пара библиотек для рисования квадратиков. у процессинга свой IDE, который под капотом прозрачно оборачивает всё что ты написал в класс PApplet и запускает его. Плюс в том, что можно быстро делать прототипы или алгоритмически рисовать. фабрики createShape() там вызываются без какой-то явной привязки к коду, в зависимости от бекенда p2d, javafx, swing, awt оно там где-то скрытно делает свою магию. что тебе непонятно?
есть один экземпляр класса, как в рантайме добавить в сам экземпляр новый функционал? наследование и декомпозиция нахуй не нужны. жаба на такое способна вообще через рефлекшены или это только прерогатива змеиных людей?
>что тебе непонятно?
С этого и надо было начинать. Теперь понятно.
>жаба на такое способна вообще через рефлекшены
Ну можешь java.lang.reflect.Proxy попробовать.
Всм? Впн врубил и халявно в эдже. Другое дело, что куцый порой, надо вопросы задавать не через жопу.
Бизнес-логику на аспектах не пишут никогда.
Всякие перехваты ошибок, логи, кеши, проверку доступа иногда могут писать.
А почему синглтон? Чё б не делать их статическими?
Можешь и не статический делать в бине, всем похуй.
Так скоуп и лайфсайкл классов сам по себе в 99% случаев привязаны к приложению. Оставшийся 1% - это какая нибудь класслодерная магия типа OSGi.
>>44067
Потому что нестатические синглтоны не дают никаких бенефитов, а проблем несут дохуя. Правильный ленивоинициализированный синглтон написать в SE, который бы учитывал многопоточку - задача не такая тривиальная как кажется. А требовать тащить DI контейнер ради логгера-синглтона = пройти нахуй, ибо оверкилл и ненужон.
Я не только про время жизни, а и про количество экземпляров логгера. Он спать будет от имени класса.
К слову, а нахуя делать ленивые синглтоны? Они очень редко дают профиты.
>Он спать будет от имени класса
Кто спать будет?
>про количество экземпляров логгера.
А что с экземплярами логгера? Будет один на класс. Почему вобщем то должно быть иначе?
>К слову, а нахуя делать ленивые синглтоны? Они очень редко дают профиты.
Нинахуя. Если ты не на собесе, самому вообще никогда не надо делать синглтоны. Либо пусть спринг делает, либо выносись в статику и енамы.
>Будет один на класс.
Ну вот. В случае статики один на класс, в случае синглтона одно на приложение.
>Кто спать будет?
Срать. Пик.
Так один логгер на приложение с потребительской точки зрения - это хуйня постная. Эдак и логгинга не надо - пиши все в System.out.println, будет он для тебя выступать как один логгер на приложение.
Ну я имею ввиду, что синглтон не будет множить экземпляры. Следовательно индивидуальные для класса настройки не сделать. Правда есть ли они, но вроде вот по getLogger - есть.
Да и sout в любом случае хуита, ибо ее можно легко закрыть и никогда больше не открыть.
Ну чел, ну хули ты душишь - "экземпляры множить"... У тебя один экземпляр на класс в худшем случае - все, прям экземпляров наплодил, пиздец пацаны, футпринт в хламину ебана...
Это во первых
Во вторых - есть логгер, и есть LoggerFactory (в slf4j). Имплементации оного стараются кэшировать логгеры для одинаковых вызовов getLogger, что какбэ тоже не способствует существованию избыточного количества логгеров.
Аноны, поясните кто нибудь за работу.
Есть ли она на жаве в рф?
Что обычно пишут? Веб приложухи? Какой то софт?
Какие зп? Реально ли в 2к23 вкатиться?
Нихуя нет. Вкатится анриал. Иди в шарпы.
> Есть ли она на жаве в рф?
Есть, я же работаю.
> Что обычно пишут? Веб приложухи? Какой то софт?
Пишут энтерпрайз. Вебом это называют редко, потому что вся суть именно в бизнес-логике на сервере, а от веба там только фронтальная часть, которая может быть и десктопом, и мобилкой, и другим сервисом.
> Какие зп?
100 для джунов, 150+ для миддлов, 300+ для сеньоров.
> Реально ли в 2к23 вкатиться?
Реально.
>300+ для сеньоров
Сеньоры нынче до 300к. И 300к - это действительно сеньор, а не перекладывание жысонов в крудах на спринге. Т.е. это проекты и задачи уровня компаний МЯСКОТ.
Чуваку на Хабре вон 400к предлагали. Он взял и в три конторы параллельно подал, а потом каждой из контор сказал что другая предлагает больше. В итоге получил предложение на 700к.
Какие нафиг 300, если за 200 пыхапэ-макаки формошлепствуют?
Это java - тут же немножко мозга приложить нужно, это должно стоить больше.
Курсы, учится самому кринж.
Как конкретно создаются @Bean в конфиге? Еще непонятен момент, как именно подменяются вызовы внутри этих бинов на другие бины. Правильно я понимаю, что это можно представить как прокся factory-bean из xml контекста? Типа создаются прокси фабрики и навешивается scope на их фабричный метод, а также все вызовы старого метода подменяются вызовом прокся-метода.
Еще непонятно чем конкретно отличаются Service и Component, вообще не понимаю, когда мне одно вешать, когда другое.
>Из серии глупых вопросов.
Наверни в ютубе Борисова "спринг-потрошитель". Он эти вопросы раскрывает.
>Еще непонятно чем конкретно отличаются Service и Component, вообще не понимаю, когда мне одно вешать, когда другое.
По сути, для спринга разницы литералли никакой. Service - просто метка для кодера что вот тут вот лежит бизнес логика. Да - звучит бредово, но это так.
>Наверни в ютубе Борисова "спринг-потрошитель".
Я смотрель, там не было момента про конкретно это. Скажи насколько я прав в своих рассуждениях...
>По сути, для спринга разницы литералли никакой.
Я по етому и спрашиваю. Если так рассуждать, то в сервисах декларация того, что должно делать приложения, в компонентах, то как оно это делает. Хотя контроллеры - это компоненты, сложно как-то.
Ну как это - "не было". Если я правильно помню, все было. Спринг сканирует аннотации в конфиге, из которых выводит биндефинишены, в которых вся инфа о бинах, его зависимостях, их типе, параметрах и.т.д. На основе биндефинишенов создаются бины, далее либо бины инжектятся друг в друга, либо вместо бина инжектится прокся, которая развязывает скоупы.
>Еще непонятен момент, как именно подменяются вызовы внутри этих бинов на другие бины
Вот этот кусок твоего мессага вообще не понял. С чего бы спрингу подменять вызовы бинов? Ты здесь про что, про аспекты?
>Если так рассуждать, то в сервисах декларация того, что должно делать приложения, в компонентах, то как оно это делает
Не, так рассуждать не получится. Это интерфейсы и их импелементации соответственно, это не про бины.
Просто забей. Пусть тебе ревьюеры на кодревью скажут, что они хотят над бинами видеть.
>С чего бы спрингу подменять вызовы бинов?
Пик. Это wiring, вроде тоже. Из-за этого s2 = true.
>На основе биндефинишенов создаются бины
Ну т.е. из этого дефинишина спринг может как создать прокся класс, так и взять существующий?
>Просто забей. Пусть тебе ревьюеры на кодревью скажут, что они хотят над бинами видеть.
Понял...
Хм, судя по всему, создается прокся объект конфига, который все вызовы this подменяет.
Так а Шилдта на англе читать?
Тамушта кнута надо.
В чем киллерфича?
>Борисова "спринг-потрошитель"
Смотрел два раза. До и после изучения Спринга. Первый раз вообще ничего не понял. Второй раз понял только то, что и так знал. У него просто талант рассказывать максимально непонятно. Ещё и манера подачи мне не нравится, куда-то вечно торопится, как-будто его одни гении смотрят и способны за секунды разбирать то, что он показывает. Сам-то он наверняка эти моменты часами обдумывал. Ещё негативный момент, что он Спринг-евангелист и из-за таких как он нет выбора фреймворков для джавы.
я вообще не понял смысла всего этого. Городить кучу кода с учетом знаний кишочка спринга чтобы сделать магию на аннотации.
Но магия это ведь плохо. Магия это неожиданное поведение, конфликты, необходимость знать про эту магию и учитывать её. Сломается эта магия или где-то на стыке двух магий и пиздец
Я тоже. Есть ООП, которое позволяет всё тоже самое писать, и проверки будут на стадии компиляции. Но нет, навернём миллион бесполезных конструкций, чтобы нагружало систему в рантайме.
Ты пользуешься ею? Слишком контрастная по-моему.
https://github.com/gracyaneoliveira/spring-start-here-book/tree/main/sq-ch13-ex1/src/main/java/com/example
Но если AccountRepository#changeAmount не будет CAS, то при конкурентом доступе, все пойдет пиздой, я прав?
И как именно транзакции отменяют все действия? Там в бд создается снимок что ли?
Читай про ACID и про уровни изоляции транзакций.
В БД создаётся снимок или журнал действий в зависимости от реализации СУБД.
>Но если AccountRepository#changeAmount не будет CAS, то при конкурентом доступе, все пойдет пиздой, я прав?
Не пойдет. У тебя весь стейт, к которому конкуррентный доступ, в базе. База его изменение и синхронизует.
>И как именно транзакции отменяют все действия? Там в бд создается снимок что ли?
Литералли все СУБД сегодня поддерживают транзакции. Как конкретно каждая из СУБД это делает - вопрос к конкретной СУБД.
>конкретной СУБД.
MySQL пусть будет.
>е пойдет. У тебя весь стейт, к которому конкуррентный доступ, в базе.
Имею ввиду взять значение до завершение транзакции и на его основе что-то сделать. Ну или записать значение в одной транзакции, а другая откатит.
Получается бд всех участников guarded by a lock и спринг этих участников ей посылает? Или она вообще всю табличку ебает на локу?
>>46496
Можешь статейку скниуть...?
транзакциями занимается база. В коде ты можешь только слать команды начала, коммита или отката транзакции
https://dev.mysql.com/doc/refman/8.0/en/commit.html
эти команды шлёт jdbc, спринг просто управляет отправкой этих команд где-то внутри кишочков
Это уже вопросы изоляции транзакций
Тут БД можно настроить по-разному
При одних настройках транзакции не изолированные, при других изолированные
Вообще эта тема к программированию не относится - это именно работа СУБД. Тут очень много тонкостей и особенностей.
Все они +/- следуют некому общему стандарту, но в деталях пиздец как отличаются, и без учета особенностей конкретной СУБД можно быстро сесть в лужу
>Получается бд всех участников guarded by a lock и спринг этих участников ей посылает? Или она вообще всю табличку ебает на локу?
Да не, ему обычно нужды нет. И кстати я выше приврал малясь про базу, потому что помимо базы обычно есть еще персистенс контекст от ORM. Там - свои локи и своя кухня. И вообще я щас спеку JPA чекнул, и вспомнил что EntityManager вообще то не тредобезопасный, и конкуррентный доступ к нему вообще запрещен...
Короче нюансов там - я ебал, не зря спринг это магия. Слава богу что я давно уже не юзаю ORMы.
Честно говоря, я вот щас даже сам с наскоку не вспомню всех нюансов.
ну я примерно освоил эти изоляции.
в постгре изоляция по дефолту read commited, видны только закоммиченные данные. Не защищает от потери данных в случае параллельного коммита.
если ставим serializable - при параллельном коммите будет выдавать ошибку на втором коммите.
Если хотим реальную блокировку, чтобы второй поток ждал - делаем через select for update, второй select for update будет ждать когда закоммитится первый, и только тогда селектить.
Если у нас чтение и запись в разных транзакциях - обязательно делать оптимистическую блокировку. Проверять что данные между чтением и записью не изменились
DataSourceTransactionManager
Прям здесь бы и писал свою бизнес-логику
Нехуй всяких говнокодеров смотреть.
Это магия только для тебя тк ты вкатыш. Для человека который знает как работает спринг все предельно понятно и предсказуемо
Именно поэтому его метод нерабочий по итогу оказался? Так все панятно и предсказуемо?
Посмотрел пример на вики.
Type type = System.Type.GetType("Foo");
var foo = Activator.CreateInstance(type);
foo.GetType().GetMethod("Hello").Invoke(foo, null);
И зачем это надо? какое практическое применение? выглядит стремно
все ооп-анальники такие злые? и я на тебя не обижался, ещё мне на какую-то скриптомакаку обиды держать, хах
>все ооп-анальники такие злые?
Да. Я тебе ссылку дал, там написано прямо, нахуя это нужно. Также в википедии наверняка пишут.
>хах
Верю.
создание магии и всякие манипуляции, которые невозможны обычным синтаксисом.
Например копирование объекта, филды которого скрыты и защищены
настолько предельно понятно, что эту сраную лекцию возносят как грааль. Т.е. никто до этого не знал, и в мануалах это не описывается настолько подробно
>Например копирование объекта, филды которого скрыты и защищены
Это ж clone паттерн. Зачем здеся рефлексия?
Такие как ты вкатыши и возносят. Остальным все понятно.
Ну значит не нужно его править. Тут как с intterput у потоков, ты проста берешь и надеешься, что поток реализовал у себя адекватное прерывание. А stop не применяешь примерно никогда. Если тебе надо клонировать защищенные, с точки зрения апи объекты, то ты точно что-то делаешь не так. Тем более, что рефлексия бьет по перфомансу.
ну вот чувак реализует поведение через рефлексию, оперируя кишочками спринга. Это нормально?
Ну он не взаимодействует с объектами вообще. И это происходит во время запуска бута, а значит +-похуй на перфоманс. Так что да, че нет-то?
Нихуя. Это следствие, а не цель.
>>47113
Рефлексия - это просто API, который позволяет программе в рантайме получать (и иногда даже модифицировать) инфу о своем внутреннем устройстве - в частности, о классах и их содержимом. Ни больше ни меньше.
По дефолту, если ты не занимаешься метапрограммированием и не лабаешь какой нибудь системный тул для анализа и инструментирования кода, рефлексия считается запрещенной техникой.
Вон же, говорят, что там усе понятно и ясно >>47101
Не-не. Именно о неявности, Мол спринг ахуенный инвазивный и в отличии от других Фреймворков не вставляет кучу своего апи. По мне - это неявность. Ну и да, мол вообще потом этот код можно вне спринга использовать(Ахуенные истории)
Это просто маркетинг. Анальникам очень хорошо продаются истории про минимум кода, неявность и неинвазивность.
Будет полезно новичкам.
Хуйню какую-то несет не к месту. Зачем это все?
Мне по каждому пункту пояснять?
Расширения файлов определяет ос, жава тут ничего сделать не сможет. Вот какое расширение у *.tar.gz? А у sh скрипта без точки вообще?
Эти восклицания, кринж. Сам создал проблему, сам героически ее решил. К чему эти клоунские ужимки?
К чему здесь телега про названия?
Да-да, (д)жаба лучше гадюки, классика
>Расширения файлов определяет ос, жава тут ничего сделать не сможет
А Питон может.
https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.suffixes
Ну это хуйня такая же, что и в хабре написано. Вам серьезно нужны функции над функцией? Сплит по точке, latindex и firstindex. Я хуею, а апач индусы качают что ли, которые is_odd написать не могут?
В чем вообще смысл этого язычка? мало того что синтаксис непонятный, так ещё и надстройка над жабой
Заебал синтаксис кобола, хочется тоже почувствовать себя хипстерами. Конечно синтаксис непонятный, разве он бывает хоть в одном языке понятным без изучения? Я когда учил жабу после сишки, тоже не понимал нихуя.
Ну, да, больше над самой этой экосистемой. Я кстати так понимаю у них и выбора другого не было, ведь в андроид в VM выполняется, своё они вряд ли могли привнести
Какого выбора, ты про что? Они просто фанаты жабы и все. У них иде для нее и на ней написана. И они всрали просто дохуя бабла в этот яп, который чудо что взлетел, а ведь мог и не взлететь.
Хотя, смотрю эклипс тоже на жабе написан. А вот vscode не на шарпе. Делаем выводы.
Увы, все IDE для жабы написаны на прожорливой неповоротливой жабе.
VSCode не на шарпе, да. Мелкие неклепали дохуя шарповых говнолиб для гуя и сами же боятся их использовать, да и поддерживать линукс не хотят, ибо не профитно.
>написаны на прожорливой неповоротливой жабе.
Не гони на наш хлеб. HotSpot ахуенен, просто у кого-то руки кривые.
как такой формат принимать в теле в виде инстанта с помощью джексона?
@JsonFormat(pattern = "YYYY-MM-DDThh:mm:ss.X")
должна же быть такая хуйня, но не работает
Скорее всего тебе надо подключить и настроить этот модуль.
https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310
https://www.baeldung.com/jackson-serialize-dates (секция 9)
бля хуй знает братан
Вообще нахуй не нужны. Только когда у тебя жизненно важная функция и тебе нужна абсолютная гарантия детерминизма
Contract-first - когда сначала пишешь XSD, а под сгенерированные по ней типы пишешь уже логику на жабе. Предполагается, что эту XSD ты потом передашь потребителю сервиса, чтобы он на своей стороне генерировал по ней типы.
А с Contract-last всё пишешь на жабе.
Невозможно в общем случае. В частных случаях доказать можно.
Можно, можно. Есть даже инструменты для этого https://github.com/coq/coq
Вроде с его помощью или другим доказывали сортировки.
Чет по описанию, хуета какая-то. Нахера мне генерить классы?
Еще автор говорит, что last уступает first. Мб я тупой...
>Нахера мне генерить классы?
Контракт, это такая хуйня, которой в одиночку обычно не пользуются: всегда есть как минимум один провайдер и один клиент. И вот есть у тебя допустим спринговый вер-сервис как провайдер контракта, и джавовая программа, как потребитель. При contract-last, в веб-сервисе ты сначала руками лабаешь MVC-рестовые контроллеры, потом так же руками лабаешь вызовы на ресте в клиенте. Рестов много, ошибиться просто. Контракт может меняться, вменсте с контрактом нужно апдейтить обе стороны. Ситуация еще на практике обычно усложняется тем, что обе стороны мейнтейнят обычно разные команды. Все это просто минное поле ошибок.
Есть альтернатива. При контракт-first, ты описываешь контракт нейтральным конфиг файлом один раз в одном месте. Например OpenApi спекой. А потом берешь генераторы сорцов клиента и сервера на джаву, и скармливаешь им эту спеку. Код пишет машина, вместо человека. Человеческих косяков она при этом не делает. Если контракт меняется, меняется лишь спека. После апдейта спеки остается лишь перегенерить сорцы и проверить что ничего не сьехало в самом софте по типам. Координировать работу команд в такой парадигме в разы проще. Менять контракт - в разы проще. Не случайно щас многие заказчики требуют вместе с RESTами сваггер - им по таким рестам интегриться тупо проще.
Единственный душный момент - ты становишься привязан к тому, как тебе по спеке генераторы код пишут. Генераторы очень рознятся по качеству, и могут не поддерживать (или поддерживать не так как ты ожидаешь) отдельные фичи, вроде аплоуда файла.
Хмм, пасиба огромное, что пояснил. Теперь гораздо понятнее
В новейшей редакции это вырезали. Вопрос остается, как эта хуйня вообще работает.
Решил потыкать, вроде как кандидат выбирается исходя из того, кто вызвал.
Надо понимать, расчет идет на то, что все вызовы будут идти таким образом, что Scope будет идти от многих к одному. Интересно, возможна ли иная ситуация...
Конкретизируя - это ThreadLocal, где Thread заменены на Request/Session.
>Я правильно понял, что прокси мод создает лист из реальных объектов с большей видимостью?
По всякому может быть. Я бы на твоем месте не гадал, а пошел бы смотреть имплементацию.
>Типа если сервис сначала получает данные от сессии, не знаю, список товаров, и посчитает общую сумму, то для каждой сессии будет своя сумма? Хотя это бред какой-то, зачем все сессии обрабатывать-то сразу.
Так да. Сам подумай - вот есть у тебя рест. В ресте выполняется запрос. Он определяет реквест-скоуп - для каждого реквеста будет свой реквест-скоуп бин. Далее - реквесты у тебя обычно выполняются в контексте серверной сессии. Сессия определяет session scope. И так далее. А теперь сам ответь на свой вопрос - зачем все сессии обрабатывать сразу, если у тебя выполняется конкретный запрос с конкретной сессией?
>А теперь сам ответь на свой вопрос - зачем все сессии обрабатывать сразу, если у тебя выполняется конкретный запрос с конкретной сессией?
Ну я изначально и подумал, что это бред какой-то. Теперь думаю, что можно проанализировать стек вызовов и определить нужный в данный момент реквест и сессию. Возможно там как-то иначе реализовано, но в общем-то суть в том, что сервисные методы вызывает реквест или сессия. Потому все еще вомзожно определить, какой бин надо подставить. Плюс так проблем с многопоточностью не будет.
Тут я выше аналогию с ThreadLocal проводил, только вместо того, чтобы привязывать объект к конкретному треду, мы привязываем его к реквесту/сессии.
>пошел бы смотреть имплементацию.
Я не настолько хорошо разбираюсь в кишках спринга, чтобы найти на каком этапе начинается реализация scope.
Какую IDE выбрать?
Какая лучше, удобнее?
Я там пошаманил и заставил вызывать не из реквеста:
Exception in thread "Thread-1" org.springframework.beans.factory.support.ScopeNotActiveException: Error creating bean with name 'scopedTarget.purchaseController': Scope 'request' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
Короче, вроде так оно и работает.
vim тогда уж.
Я на нетбинсе долгое время работал. В свое время была пушка, но щас чет уже глючит.
А чем тебея Idea community не подходит?
Да, там даже расширение бесплатное есть. А на идею спринг только платно идет.
Не работает - пробовал через vpn и другие браузеры регать аккаунты на новые почты.
Пишет "На этом компьютере триал уже был активирован".
Ну хуй знает. Я вот CLion брал на месяц - шел третий по счету, но никто блочить не собирается. Винду переустанови, не знаю.
Там вроде бы цимес в том, что если ты его прям покупал, у тебя эта лицензия стала бессрочной, но на конкретную версию, без апгрейдов. С бесплатными так не прокатит.
Я ни копейки жидбрейнсам не занес. Да и они уже не возьмут. По моему произошла чудовищная ошибка, а я и не против.
В новой редакции посчитали, что вкатунам это знать не нужно.
Это общая проблема: прикинь вот ты как автор книги описал этот лайфсайкл, а авторы фреймворка взяли, и чето в нем поменяли. И все. Читатель-вкатун начинает плеваться - "книга устарела, вводит людей в заблуждение, фу читать книги".
Ну вот чтоб устаревала пореже, приходится абстрагироваться.
Открываешь любой тред, возможно кроме плюсов и лиспа (джависты умнее всех, поэтому серят в тредах питонистов\пубистов\пхпистов\жсистов, но вот в тредах языков, где не наворовать смехуечек с баша их почему то нет), читаешь последние 10 постов, в каждом будет залетный элитист "ваш язык хуйня, работы нет, учите джаву"
Это обиженная шарпоблядь дискредитирует
Пруфы кидай, ссылками. Пока что серишь здесь только ты под себя.
>учите джаву
Жависты хитрые и обычно призывают учить шарп, котлин в крайнем случае. Мол жава старая, многословная, медленная и прожорливая - зачем она вам.
Кек, то есть все залетные шарпеи в джава-треде - на самом деле латентные джависты? Это многое обьясняет.
Именно так. Зачем растить конкурентов, если можно заманить их в шарп. Раньше с питоном так делали, пока там рынок не заполнился под завязку.
Смысл твоего высера?
127. Уровня влажности нет, есть только ограничение длины пути, половину которого съедают слеши папок.
Тогда и имя тома + "://" еще сжирать должны. Если мы про абсолютный.
Мне вот интересно, а как компании обходят эти ограничения? Модифицируют ntfs или ставят другие фски? Или вообще похую и раз максимум 256, то пусть будет 256
Имя тома нет смысла хранить, оно всегда одинаковое, просто таблиц несколько.
Компании просто запускают всё на специальной виртуальной ФС, где длина пути может быть хоть 10 терабайт.
Анриал вообще. Да и в других странах шарп. Я думаю ты не тот язык выбрал.
Это фумигатор.
Аноны, хочу за лето вкатиться в жаву
Я заводчанин, образование социолог Думаете получится?
Пока зарегистрировался на гикбренсе и даваруш и скачал Алгоритмы на Java.
Ваши советы как не проебать время, выучить как можно больше за лето и к осени найти работу разрабом хотя бы за 50к.
Смотри, качаешь себе томики Кнута и кайфуешь. Думаю за лето сможешь освоить. А там уже и в гугл можно.
ШАPП
Я тя вздрючу
я с 10 летним стажем жабамакаки имею сложности с трудоустройством. На джуна - там 10 вакансий на всю россиюшку по 2к откликов.
Чел, щас ситуация как с юристами и экономистами, оно уже случилось
как-то же до этого работал, проходил испытательные сроки, завершал проекты. И есть некая хуйня с образованием филолога, которая хочет вкатиться. С чего он будет лучше меня?
>как-то же до этого работал, проходил испытательные сроки, завершал проекты.
Не показатель компетенции. Ты мог быть и балластом.
>С чего он будет лучше меня?
Ну конкретно он, вряд ли лучше будет. А у тебя профильное образование?
У меня на втором курсе, правда я ни одно занятие не посетил.
Можно гайд какой-то? А то везде бут ебаный
ничосе. А так можно?
Качаешь томкат, запускаешь. Собираешь .war своей приложухи, деплоишь в запущенный томкат, он его подхватывает и развертывает сам
в бут встроен минитомкат. Он занимает весь порт одной приложухой. В оригинальном томкате ты на одном порту можешь хостить хоть десяток приложух, различаться будут урл
Окей, понял. Гайд по запуску оригинального томката можно? И деплой туда spring-mvc без бута.
Плюс я тут логи смотрю, он просто не видит мой класс. Как блять ему указать
>Гайд по запуску оригинального томката можно?
когда скачаешь - там в ридми вроде есть. И на сайте. Вкратце запустить run.bat из /bin папки
>И деплой туда spring-mvc без бута.
нужно собрать .war приложение. Нужен плагин для мавена для сборки варников. Подробности не помню, в мануалах
Просто копируешь в паку /webapp томката и оно развертывается
Это быдлан решил так поднять своё чсв и унизить того, кто ему будет отвечать. А хомячьё из этого треда повелось.
Да, скорее всего ты прав.
Приезжай, няш. Только вон томкат мне почини перед этим...
В общем-то, там зависимостей не хватало и еще я собирал криво.
Вродь робит теперь. Правда почему нельзя было как в буте сделать...
А какие у тебя знания есть вообще? Типа можешь сказать, что это за помощь гц?
Это метод из LinkedList и в 181 строчке нода, в который эти ссылки находятся, также перестает хранится.
Если ты миддл - ты решаешь все поступающие тебе задачи автономно. Можешь так? Если да - то нормально.
Да, попробуй сбербанк или его дочек. Там адские дебилы сидят поголовно.
Ума не наберешься, но опыт будет.
608x1080, 0:18
У мине 20 лет опыт-лар. Работал на самом острие всегда: самый опасный проекты, самый проблемный баги. Год за два ежжи.
1000+ проведенный собеседование, 100+ пройденный. Запрлата 500к+
Менял место работа много раз. Например, в IBM работал.
Готов пояснить за что-нибудь, если долго вчитываться не надо.
вопрос: что вам нравилось в прошлой работе?
Мой ответ: отлаженные процессы, не нужно самому общаться с заказчиками и менеджерами, есть отдельный аналитик, выстроенные процессы.
Кроме того нравилось расположение компании в центре, почти свой кабинет, рядом фитнес с бассейном и парковка.
Но ассайнился я на удаленную работу. Сказал что есть опыт удаленки в ковидлу
вопрос: что вам писали в замечания на код-ревью
мой ответ: в основном это было связано с моей невнимательностью и замыливанием взгляда
вопрос: какие книги вы прочитали за последние пол-года
мой ответ: мук хрюк смотрел видосики и решал литкод. Читал пару книг, но не дочитал до конца. Кроме того прочитанное в книгах быстро забывается.
реджектнули на финальном собесе после этих ответов. Что не так?
Если книг читать не будешь - скоро грамоту забудешь!
Я не умею читать мысли.
Из того, что могу предположить - только первый ответ может вызвать проблемы. Возможно, что в их компании как раз нет аналитика и выстроенных процессов. И такой ответ показал, что Вы не готовы работать с их подходом - делай всё сам от сбора требований, до тестирования.
Почему отказ - может быть разные ситуации.
Процесс найма происходит по чьей-то инициации. Например, какой-то тим-лид говорит - нужен ещё сотрудник, далее менеджер оформляет заявку на подбор сотрудника. Далее проходит пара собеседований, и охотник на живой товар начинает требовать обратную связь от менеджера и тим-лида. Вот что в голове у этой парочки - можно только гадать.
может быть, у них оказался под рукой более подходящий кандидат.
Может быть, в их процессе подбора произошёл сбой. И когда охотник начал требовать обратную связь, выяснилось, что тимлид сказал, что нужен фронтэндер, а не бекэндер.
В общем, тут одни догадки. Твои ответы вполне приемлимы. Хотя мне они не нравятся. Я сам уже давно никакой книги не читал, но слышал о них.
ещё одно забыл.
Что вы ждёте от компании?
Мой ответ: т.к. у вас госфинансирование, есть риск что это финансирование пропадёт и вам придется сокращать штат. Я бы не хотел чтобы такое произошло
У техдиректорки ебало скривилось
я выше описал видение ситуации. Ничего странного в Ваших ответах не вижу.
Ну не понравился и не понравился. Ничего страшного: это не последняя вакансия на рынке.
Посоветуйте какой-нибудь курс / серию уроков по созданию приложения (для опыта надо увидеть, как делают веб-приложения опытные программисты).
Нашел сайт со Spring Boot, это может сказаться на получении будущей работы - или надо самому создавать зависимости в проекте?
Планирую пушить проекты на Гитхаб, и потом показывать работодателю.
> или надо самому создавать зависимости в проекте?
Для добавления зависимостей в помник ничего уметь не нужно. Чуть сложнее с конфигурацией, но она тоже легко гуглится. И проект у работодателя уже будет готовый, остаётся только новые сервисы с логикой писать.
> Планирую пушить проекты на Гитхаб, и потом показывать работодателю.
Их почти никто не смотрит, все учебные проекты однотипны, да и часто их копируют друг у друга. Будут просто задавать вопросы.
Пикрил. Не надо никаких ServletInitializer-ов и устаревших легаси WAR-ников. Тупо пишешь это и можешь клепать сервисы и контроллеры.
>Для добавления зависимостей в помник ничего уметь не нужно.
Всм не надо? А как же зависимости править, вон на пике например, кто от кого зависит кто кому подгаживает, пара пакетов может иметь другие имена и тд и тп. Такая ебля, если честно. А еще билд настроить.
Я ничего и не закреплял.
Мне нужен цикл уроков, в которых автор делает какое-нибудь приложение - желательно максимально используя Spring.
Чтобы, повторяя за автором, я научился проектированию приложений на спринге. Например, уроки по созданию какой-нибудь соцсети или онлайн-магазина.
Только чтобы курс актуальный был.
>>51011
Курс Заура Трегулова
https://www.udemy.com/course/spring-framework/
Также сейчас смотрю Наиля Алишева.
>Курс Заура Трегулова
>
>Также сейчас смотрю Наиля Алишева.
Это опять шарпоблядь жирнит, не отвечайте ему.
Подключаешь пару основных зависимостей, остальное подтягивается автоматически как транзитивные зависимости. Что-то не работает => лезешь в гугл => добавляешь. Гуглом пользуются все, никто эту ебанину в голове не держит, да и настроить надо только один раз.
Настройка билда сводится к сборке fat jar через конфигурацию maven-assembly-plugin на 15 строчек, которая легко ищется на stack overflow. Всё.
Это вообще по другому работает. Я тут ручками диспатч серверлет создаю и контекст тоже. Тогда как эта хрень делегирует этот процесс.
И чому твое чудо новое и не устаревшее, если это возвращение к ручному управлению?
> Это опять шарпоблядь жирнит, не отвечайте ему.
А что, такой классный язык? Может, зря мы тут с жабой возимся?
Да, зря, вкатунам по ебалу на.
У меня для теста вот нужны пакеты с пика 1, а для деплоя пик 2.
В одном есть serverlet 3, а другом еще 2.4 и 2.5. Поэтому для тестов надо чета отключать, а для деплоя включать. Циклическая зависимость какая-то. И че-т мне кажется, самый простой способ решить эту хуйню - загрузить бут.
В градле не могут автоматизировать неломание обратной совместимости каждые полгода. А суть не изменилась, всё та же ебля с зависимостями и билдом, просто строчек надо меньше писать за счёт выпиливания громоздкого XML.
Нет, не та же. Ебли гораздо больше, настолько, что если сравнивать её количество с мавеном, то градл эту еблю и придумал.
Не хватает готовых плагинов, предлагают их писать с нуля. В мавене эти плагины тоже не сразу появились. Вот лет через 10 заживём!
Ебля идёт как раз из полуработающих самописных плагинов, ломающихся от окружения и отсутствия ритуала перед сборкой.
Да, и вкатуны так и дальше будут здесь спрашивать про сервлеты, сборку WAR-ников и деплой на сервера приложений (кроме Kubernetes).
>здесь спрашивать про сервлеты
Как раз хочу спросить. А в spring-mvc сколько конкретно сервлетов работает? Правильно я понимаю, что там один dispatchServerlet, который запросы отфутболивает в контроллеры с RequestMapping?
Если да, то как там многопоточность реализована...
Ты не знал? Kubernetes - это сервер приложений. Появился из-за того, что в других языках не успели изобрести аналоги Websphere, Wildfly и Glassfish. Теперь для чего-то тащат кубер в жабу, хотя и так всё нужное есть.
ну так и есть в принципе да
Да.
Многопоточность делается на уровне контейнера сервлетов, там грубо говоря несколько воркеров берут данные запроса, упаковывают их в HttpServletRequest и передают их методам одного и того же экземпляра DispatcherServlet.
>Правильно я понимаю, что там один dispatchServerlet
Да
>Если да, то как там многопоточность реализована
Как и везде. Все запросы выполняются в выделенном для этой цели тред пуле.
Ацтань. Тут чу-чуть осталось до секурити. Можно регистрацию наконец-то не косячную запилить будет. Жалко некого лично заебывать... Приходится в тредике спрашивать.
>Жалко некого лично заебывать... Приходится в тредике спрашивать.
Ничего страшного, здесь все тебя ненавидят.
Это хорошо. В крайнем случае еще есть форум, группы в тгшке, дискордике. Заебать-то я найду кого.
А я при вкате даже в тредике спрашивать стеснялся. Всё гуглил и читал доку по нескольку дней.
Та я тоже гуглю, просто хочу иногда убедится, что правильно понял.
Правда доки спринга мне не особо нравятся, как и туториалы по типу baeldung.
В общем, еле еле шарп догоняют. Там-то хоть отбавляй либ для работы с кубером.
Опять вылезаешь из своего мусорного мешка с опарышами?
Над яндекс едой же не смеялись
База
Я когда изучал шарп, то не мог найти книг по ООП. Решил почитать Брюса Эккеля и в итоге ушёл на джаву.
Читая про ооп без привязки к языку.
>м.б. delink?
Мысль раскрой. Я ж ниже в ветке отвечал, что у ноды, в которой эти ссылки находятся, также убираются ссылки. 180 и 185 строки.
GCC
Норм вроде, но других по спринг клауд особо и нет
Cloud Native Java ещё есть, но вообще 17 года
Бля, оформление как в спринг ин актион. Сука, чому один паттерн названия и офрмления? Есть какой-то фремворк для книг?
У меня вопрос-то, надо ли это вкатуну? Или похуй?
Так тот же издатель
>надо ли это вкатуну
Торг как третья фаза принятия.
Забудьте вы уже такое слово как "вкатун". Щас такой категории как "вкатун" впринципе не существует - ты либо конкурируешь с миддлами на равных, либо тебя в индустрии не существует.
Что касается клауда - распространен он реже, чем сам спринг, поэтому и приоритет к его изучению - ниже. Да и крайне маловероятно, что за него спрашивают на джава-собесах.
>Забудьте вы уже такое слово как "вкатун".
А я не знаю к какой категории себя отнести даже. В коре я пачти эксперт, как никак кучу лет уже в нем буквально копаюсь, а вот спринг и остальное так, считай около-новичок. Ну и на алгосы давным давно забил. Медиум и изи с литкода решу, но дальше не вижу смысла прорабатывать.
>то касается клауда - распространен он реже, чем сам спринг
Понел. Пасиба
Ааа, я прост глянул в своем городе на хх вакансии. 6. Из них подходит одна. Пиздец голод, я ебал. Мб что-то не так делаю.
Ммм, интересно, а возможно на удаленку устроится...
Хотя, всего 6к вакансий. У тебя гришь 2 с полтосом. Что я делаю не так?
Ну да, теперь вообще 2к. Так это по всей россии. Типа как в одном городе миллионнике может быть 2.5к, когда по всей стране столько не наберется?
Разобрался. Как всегда тупая идея в штаны насрала со своими офигетельными советами и подсказками. В общем, после создания фасета нельзя соглашаться на автоматическое создание артефакта, а надо самому ручками его создать, потому что идея генерирует невразумительное говно. И ещё они хотят за своё поделие денег немалых!
А чем там сложного-то? Вот это добавил в билд и проект. Делаешь конфигурацию clean, compile, package. Усе. У меня автор вообще даже не упоминал об этом...
Будь моя воля, я бы тоже через мавен собирал в каком-нибудь вс коде, а не в этой лагающей тупой идее. Но приходится мучаться и сидеть в бесячей идее. Современный джавист - это идея-разработчик.
Эта хуйня и без плагина работает. Я ж скрин из идеи делал. Я хз про что он вообще.
У меня нет ничего, только конструктор и вызываемый метод. Возможно ли тут достать из воздуха спринговую фабрику бинов и достать бин?
пердолики из яндекса сделали некие клауд функции, я пытаюсь подружить это со спрингом. Непонятно что яндекс делает с этими инит классами - заменяет на свои, или прокси, или что. Если делать Autowired - при запуске локально инжектится, при загрузке туда - null, видимо яндекс подменяет этот класс своим
Будут, но фактически будут только потому, что агрессивные анальники, и им лишь бы постучать кому-то. Фактически никакой пользы в пробрасывании контекста всюду нет, один хуй спринг это тормозящий кобол.
Бля, а ты можешь нормально пояснить? У тебя просто сначала клауд функции, потом инит классы, кстати, что это? А в конце вообще класс один.
Я правильно понял, что тебе надо написать хандлер, который из контекста в сервере получит некий бин?
>null, видимо яндекс подменяет этот класс своим
Возможно конфигурация не видит хандлер?
Какому именно? Ты их как-то идентифицируешь?
>Возможно ли из кода получить спринговый бин?
Возможно. Через ApplicationContext::getBean.
>У меня нет ничего, только конструктор и вызываемый метод.
Всмысле - ничего. Спринг то сам есть? Или только анноташки от него?
>>53671
>Если делать Autowired - при запуске локально инжектится, при загрузке туда - null, видимо яндекс подменяет этот класс своим
С чего вдруг такой вывод? Как по мне, вывод напрашивается совсем другой - у тебя в приложухе тупо спринга нет. Ты наверное расставил анноташки, и молишься на спринговую магию, а магии не случается, потому что яндекс пепяка тебе скорее всего подтягивает эту функцию из класспафа в обход спринга вместо того чтобы main с бутом стартануть или сервлет с диспатчером. Вот и вся любовь.
Не измудряйся. Вон янтекс тоже грит: просто ебошь обычное спринг-бутово. https://cloud.yandex.com/en/docs/functions/lang/java/model/spring-boot.
А нахуя? В чем профит? Ты шо так сверяешь данные, шо сяк. Не проще оставить эту задачу бд?
Внешний клиент может отправить запрос на модификацию, но не хочет, чтобы дата последнего изменения обновлялась, если изменений по факту не было.
Не особо это логично, имхо. Но вроде оно https://stackoverflow.com/questions/1506950/atomic-compare-and-swap-in-a-database
Я спрашиваю про REST, ты отвечаешь по БД. А я-то еще думал что в джава треде умные люди сидят.
Блять, а че тебе ответить? Тебе присылают запрос с обновлением данных, ты его игнорируешь по каким-то личным причинам. Это норма типа? Мб именно дату хотят обновить.
А в чем проблема достать данные из бд и сравнить их?
Идей как грязи, они ничего не стоят, валяются на каждом шагу. Нормальных реализаций нет нихуя.
Вменяемых compile-time DI фреймворков не было. Они все спиздиоли у меня из головы: генерацию сурс кода, аннотейшн процессор, даже аннотации, которые я хотел перенести из спринга. Хттп клиент почти один в один как по моей задумке, только нет поддержки абстрактных классов и декораторов.
Ты спиздил мою идею об идеях! (((
Это то, что ты скинул? Там буквально ни слова про реализацию. Да и откуда она в доках возьмется-то... Это копаться надо, а мне лень. Поэтому и спрашиваю. Вкратце хоть обрисуй. Они фабрики заместо new подставляют?
Вообще говоря, странная мысль, в яп главная фича которого - jit мы делаем что-то в aot.
Нет.
Если это манямирковый TIOBE, в котором бейсик на 6 месте, можешь сразу нахуй пойти.
Именно. Первое место питон, второе жс, третье шарп. Остальное даже упоминать не стоит, ибо меньше 10% в сумме. Напридумывали хуйни.
Так это ж замечательно, не? Меньше популярность, меньше конкуренция. Количество кода-то никуда не уменьшится.
На хедхантере.
не, не хватит. бля бэка надо минимум 16gb или будут лаги. Если хочешь ещё и докер запускать, то надо 24гб - но тут уже и ценник. Без докера 16ги должно хватать.
А в докере запущен бэк.
>Никто не зовёт пить кофе или идти в столовку, иду один.
ЖИЗА БЛЯ Я ТАК 4 ГОДА РАБОТАЮ И КАЖЕТСЯ СХОЖУ С УМА
Мне тимлид 1 раз настроил сборку докер образа в идее. Нажимаешь кнопку и образ летит в какой-то порнхаб
>настроил сборку докер образа
Странно, что тогда прям в build мавена это не добавили.
Хотя смотрю туда базу данных пихают. Типа через jndi сейчас больше не получают инфу о бд? Или это в буте где-то спрятано...
>>55251
В вакухе писале про докер. Еще в соседнем треде говорили, мол пиздос обязательно.
Ну вот у меня 3 проекта - 1 в разработке, 2 на поддержке.
1. Мне нужен докер локально: 3-5 контейнеров одновременно для каждого проекта.
2. Тестконтейнеры, до 3 контейнеров в тестах гоняются.
В докере могут быть - минио, кейклок, постгрес, монга, редис, кафка, реббит.
3. Идея с кучей открытых плагинов в несколько окон. С терминальчиками, клиентами для хттп, докеров, баз
4. Локально поднято 1-3 сервиса.
5. Хром с видосами, докой, дев-окружением, таск-трекером, логами.
6. Корпоративный мессенджер с видеосвязью.
7. Куча всякого не сильно нагружающего - почтовый клиент, корпоративный впн, иногда нужно открыть вордовый/экселевсий файл.
На все это разом 16 гигов оперативки не хватит не на одной ос. 8 не хватит и для самой обязательной части.
А по ssh откуда-то низя эти контейнеры запускать? Не знаю, мб любимая работа выделит тачку...?
Отсается только идешечка и хром.
>В докере могут быть - минио, кейклок, постгрес, монга, редис, кафка, реббит.
Мда, сколько ж всего в них пихают...
А зачем мне их откуда то запускать? Это же медленнее и неудобнее, чем каждому со своей машины запускать контейнеры с обвязкой. Намного проще иметь комп с 32 гигами оперативы.
Ну работа выдает ноут с 16 гигами оперативы, можно до 32 расширить.
Операционка на выбор бубунта или винда с всл.
Мак у нас только у тимлида, который код пишет самую малость и ему полная обвязка не нужна. Сколько там оперативы - я хз.
Я тут узнал, что в версии 21 супер апгрейд языка. Теперь для хелло-ворлд не нужно делать обвязку из класса, статического метода и т.п., достаточно просто
void main() {
System.out.println("hello");
}
говорят революционное изменение. Теперь все ломанутся вкатываться в джаву, потому что стало почти так же просто, как в питон, будет наплыв вкатышей, через три года толбы мидлов-серьёров, зарплаты скорректируются. Кабанчики в восторге.
Что вы думаете об этом?
Это ж только превью фича, не?
В сишарпе давно такое есть. Даже метод main объявлять не надо, а сразу пишешь вывод в консоль.
База. Именно поэтому он ебет.
А ещё linq, async, generic, value type. И куча куча сахара. Зачем нужна жава, непонятно
Год сижу в офисе, со всеми здороваюсь когда прихожу, с кем то даже смол толкать пытаюсь. Все еще никто не зовет - ходят своими компаниями, в столовке делают вид что мы не знакомы.
Будет плюсом (можно всякую хуйню по деплою скинуть), но не обязательно. У меня в команде техлид в этом шарит и на пару в девопсом решают все вопросы. Моего понимания хватает только чтоб запустить локально всякие базы, кафку, редис и прочую такую поебень.
>>55278
>>В вакухе писале про докер.
Мне в вакухе и про хибер писали - я его ни разу не видел, жуком пользуюсь.
>>Зачем нужна жава
Для энтерпрайза. Микрософт обосралась сломав обратную совместимость несколько раз, обрекая ранее написанные проекты быть вечным легасным говном. А сейчас нет смысла менять жаву обычную на жаву микрософт - уж лучше го какой нибудь взять.
На хх очень мало вакух с жуком.
Я уже больше года на жуке пишу и если менять работу - просто пиздец как неохота опять задрачивать хибер для собесов.
Помню, как меня два года назад попустили на жизненном цикле энтити и отличия методов энтити менеджера.
Мы норм мигрировали. А с 11 на 17 вообще легко.
Проблема не в самой жаве, а в библиотеках, которые завязаны на версиях жавы.
Или вот например на 17 жаву перекатились бесшовно на нескольких сервисах на 10-40к строк. А вот на третий спрингбут хуй там, куча всего отваливается. А времени разбираться как мигрировать нету.
>async
Убогая хуйня. Я понимаю петухлинщики выёбываются своими тормозными корутинами, но эти ёбаные асинки из петушарпа — лучше уж классические ReadWriteLock и CallableFuture.
Bruh. Ладно шарпеи - у этих с рождения самоуважения нет, но ты то куда лезешь? Явно ж не шаришь о чем говоришь. Не позорься.
Мимо
Ясно, свободен.
Как я вижу из реализации FIFOMutex она их таки дает.
Каво? По твоему у ReentrantLock, которые за счет AQS сделаны, а те в свою очередь за счет парки не имеют гарантии happens-before?
Ну и кстати вот уже по этому куску доки можно предположить, что нет там никакой happens-before
These methods are designed to be used as tools for creating higher-level synchronization utilities, and are not in themselves useful for most concurrency control applications. The park method is designed for use only in constructions of the form:
while (!canProceed()) { // ensure request to unpark is visible to other threads ...
LockSupport.park(this);
}
>>56295
Ты бы ссылок каких нить чтоли накидал, а то пока допрешь че за AQS ты имел ввиду...
>которые за счет AQS сделаны, а те в свою очередь за счет парки
А ты не обратил внимание на то, что парки там в циклах? Вопросов не вызывает?
>можно предположить
Их главная проблема, что они низкоуровневые слишком, и вот этот canProceed() должен быть lock-free
>а то пока допрешь че за AQS ты имел ввиду...
https://github.com/openjdk-mirror/jdk7u-jdk/blob/master/src/share/classes/java/util/concurrent/locks/ReentrantLock.java#L119
>Вопросов не вызывает?
Ты впервые узнал про spurious wakeups?
Чел, ну че ты душишь то? Спуриос вэйкапы, спуриос шмейкапы... Те прямым тесктом в джавадоке говорят что реквест на анпарк не сразу виден - о каком вообще тогда happens-before для park можно говорить?
>реквест на анпарк не сразу виден
Мне кажется мы разную доку читали. Там реквест на анпарк вообще липкий
>A call to unpark makes the permit available, if it was not already available. (Unlike with Semaphores though, permits do not accumulate. There is at most one.)
Такое ни notify, ни signal не дают.
Тащемта важность этого метода подтверждает еще то, что его отредачат для виртуальных потоков.
Ну вот еще признак того, что сам по себе park никакого happens before не дают:
Reliable usage requires the use of volatile (or atomic) variables
to control when to park or unpark. Orderings of calls to these
methods are maintained with respect to volatile variable accesses,
but not necessarily non-volatile variable accesses.
То есть - "ок, ордеринг мы вам гарантируем, но визибилити - сорямба, юзайте волатильные переменные".
Не-не. Это для контроля. Ну т.е. из-за того, что любая лока может проглотить реквест с анпарка требуются изъебства в виде атомиков и волатильных переменных.
>to control when to park or unpark
Но даже эталонная реализация, данная в доке, подразумевает локу. Которая должна гарантировать видимость. Потестить бы это на каких-то arm, где модель памяти мягче, чем в x86.
Да и happens-before - это как раз ordering.
>Да и happens-before - это как раз ordering.
Это не только ордеринг но и визибилити. А тут ордеринг есть, а визибилити - сорямба, не завезли.
>Two actions can be ordered by a happens-before relationship. If one action happens-before another, then the first is visible to and ordered before the second.
Я оговорился выше, когда сказал что "ордеринг мы вам гарантируем", достаточно вчитаться в цитату доки из предыдущего мессага чтобы увидеть что ордеринг они гарантируют только относительно волатайлов. Что какбэ тоже маловато для HB.
>Но даже эталонная реализация, данная в доке, подразумевает локу. Которая должна гарантировать видимость
Ты про FIFOMutex? Так правильно - там оптимистичная блокировка на атомик булене в цикле - она и обеспечит тебе видимость.
Ладно, кажись я допер, чтение волатильной переменной дает видимость для всего, что было между другим таким чтением.
https://stackoverflow.com/questions/2475067/java-locksupport-memory-consistency
>чтобы увидеть что ордеринг они гарантируют только относительно волатайлов.
В совокупности с гарантией mutual exclusion, наверное можно ей назвать, не?
>>2756391 (OP)
>>2756391 (OP)
>>2756391 (OP)
>>2756391 (OP)
И? Тут все свои
Пользовался огрызком про 2017, это отвратительно, ноутбук греется и шумит от любой средней нагрузки, но это все не главное. У меня была версия на 8гб ОЗУ, этого не хватает ни на что. ПОВТОРЯЮСЬ НИ НА ЧТО. У тебя только докер с айдией будут кушать под 10, а я еще про СУБД молчу. А тебе еще нужно параллельно держать браузер и т. д.
Щас у меня средненький vivobook (14”, r7 5700u, 16ram). Хватает, но ОЗУ порой мало, благо в пк 32гб.
Так в этом и прикол.
это хуже чем сейчас. Жаба славилось своей простотой и логичностью. Щас делают второй шарп/вторые плюсы
отказываемся от принципа "всё есть класс"? Где эта штука должна запускаться? Кто её должен запускать? Как он должен обратиться?
Ну тут как с анонимными классами. Мб и лямбду убрать?
Просто по имени пакета сделаем анонимную реализацию. Усе.
Не получаем.
Хуй саси. Скорее солнце перестанет светить, чем жаба свои принципы основные уберёт. Наоборот вон примитивы к объектам хочут привести.
Да даже если и уберёт, этого никто не заметит, т.к. ещё 50 лет будем сидеть на 8 жабе.
Хочу, чтобы не через классы, а прям на фундаментальном уровне была поддержка функций, файлы .function, functionpath вместо classpath, переменные типа "ссылка на функцию", functionloader-ы и т.д.
каталог-кун докладывает: сотни быдла бьется головой о стену, не видя двери. Для быдла выпиливают люк
В JEPе описано ж:
https://openjdk.org/jeps/445
>Second, we introduce unnamed classes to make the class declaration implicit.
>Henceforth, when the Java compiler encounters a source file with a method that is not enclosed in a class declaration it will implicitly consider such methods, as well as any unenclosed fields and any classes declared in the file, to be members of an unnamed top-level class.
Мало чтоли в джаве приколов с анонимными/VM-анонимными классами?
А тебе-то че? Этим будет заниматься javac.
А че нет какого-то жава бэйсед яп с такой херней? Или там упираются уже в jvm?
Ну как, примитивы отдельная сущность. Я правда не знаю, в стейке ли они живут или нет.
всякие груви и скалы. Не получилось перевести всех на хаскель - попробовали сделать скалу. Не получилось перевести на скалу - из жабы делают хаскель/скалу
Никому не нужен ваш чмаскелль, хватит фантазировать
>прям на фундаментальном уровне была поддержка функций, файлы .function, functionpath вместо classpath, переменные типа "ссылка на функцию", functionloader-ы и т.д.
И что тебе это бы дало?
Подумай вот о чем - на уровне железа один хуй у тебя будет императивный CPU, работающий со стейтфул-RAM. Чистенькими остаться не получится, рано или поздно придется делать грязные делишки, так чем JVM не кандидат?
Ну вот в шарпе же смогли в делегаты
И? В чём проблема?
Ты на функциональные языки программирования намекаешь или на что? Функции как в хаскелле мне нахуй не нужны, мне надо как в плюсах.
А че тогда с перегрузки операторов не начал? Это так вообще идеологически добавлять не хотят.
такими темпами скоро будет. Там в жабе руководство поменяли или что? Откуда появилась такая тяга к сахарку?
>Ты на функциональные языки программирования намекаешь
Да.
>Функции как в хаскелле мне нахуй не нужны, мне надо как в плюсах.
Какие нахер функции в плюсах, чел? Классы, да процедуры.
Мне она не особо нужна. Сложно придумать задачу, где с перегрузкой операций становится значительно удобнее писать код. В вузовских лабах на сложение матриц это выглядело прикольно, но в повседневной бизнес-логике это ну никак не применить, здесь и обычное умножение юзается нечасто.
Да вроде на большинстве пакетов имя гетца красуется. Так шо сомневаюсь.
Да и пока нормальный сахар.
Есть некий сервис, с возможностью регистрации. Данные пользователя соответственно: логпасс, инвайт, счет фантиков. Также этот сервис позволяет делать эмиссию и ремиссию денег посредством лотереи. Таким образом, общая масса фантиков будет зависеть исключительно от удачи. Также есть возможность дебета и кредита между юзерами.
Идея в том, что лотерея сама по себе будет производится посредством ГИСЧ, таким образом надо как-то делать так, чтобы этот процесс не жрал все ресурсы.
Каждый пользователь с его счетом будет в реляционной бд постгресс. Также каждый процесс разыгрывания лотереи - twist, будет записываться в nosql бд - mongo. Каждый пользователь связан с другим, посредством инвайтов и это будет отражено в neo4j. Возможно, можно как-то внедрить и редис для кэша и кафку для регулирования того, что ГИСЧ очень медленный. Все вышеописанное - рест сервис. Еще будет mvc на jsp для отрисовки.
Где я проебался, что лучше изменить на этом этапе...?
>>mvc на jsp для отрисовки.
хотя бы таймлитф возьми, а лучше ебани реакт/вью
>>Где я проебался
у тебя цель какая? побольше разных технологий засунуть в проект?
>хотя бы таймлитф возьми
Ну на единственной вакухе тока jsp. Такшо надо хотя бы посмотреть, что за жсп.
>побольше разных технологий засунуть в проект?
Угу, джуновский же проект. Не знаю тока, как будет взаимодействовать спринг секурити реста с сервером отрисовки.
ПИЗДЕЦ! ТРИ ебанных базы данных! ТРИ, КАРЛ!!! Эт чё типа микросервисы шоль? Тогда какого хуя одна БД ссылается на другую базу данных. Они вообще не должны знать о существовании друг друга. Да и вообще, что в проекте такого, что не может решить одна постгря или одна монго или один neo4j? Если у тебя с самого начала проект тормозит, значит архитектура построена через жопу и её нужно переделывать, а не ставить костыли в виде кеша или кафки. Микросервисы вообще другую проблему решают. Они решают проблему менеджмента, шоп дать каждой команде по сервису и они съебали разрабатывать независимо друг от друга. Кодеру одиночке никаких особых профитов они не дадут. Если только бОльший контроль над масштабированием и чуть бОльшая гибкость деплоя. Но по факту, то что ты нарисовал это тот же распределенный монолит. От того что ты ебать сделал 3 сервиса, он от этого монолитом быть не перестал. Потому что на фронтэнде откроется страничка, и ему придётся делать 2 запроса - один в users, другой в twistes, потом эти данные компоновать и выводить на фронте. Ты только добавил переусложнений на ровном месте.
>Ты только добавил переусложнений на ровном месте.
Ебать открытие. Я просто хочу научится работать с бд. Все.
>Тогда какого хуя одна БД ссылается на другую базу данных.
Не понел, где?
В бд users будет тобличка типа
create table users (
id identity primary key,
login varchar(25) not null,
password varchar(25) not null,
amount bigint not null
);
В invites twistes будет поле user, которое relationship на id из users. Впр можно и логин туда хуйнуть, оба поля уникальны.
>ему придётся делать 2 запроса - один в users, другой в twistes, потом эти данные компоновать и выводить на фронте.
По идее, он просто делает запрос на условно 10 верхних документов на полю user и все. Айдишник известен на стороне сервера из сессии, а фронт просто пихнет код авторизации.
>Я просто хочу научится работать с бд
Ты учишься делать ХУЁВУЮ архитектуру, потому что в реальном мире ни у кого нет столько денег, чтобы содержать зоопарк из баз данных. Серверные ресурсы не бесконечные. При том что на каждый запрос будет JOIN который скомпонует данные из нескольких источников. Это расточительно как в плане запросов, так и в плане будущей поддержки. Это по сути, программирование ради самого программирования.
>Не понел, где?
>В invites twistes будет поле user, которое relationship на id из users
Ёпта, ну элементарно обнови ID у пользователя в постгре и у тебя всё посыпиться. Нельзя удалить пользователя, чтобы при этом не остались "мёртвые" ссылки в других базах. И что что они уникальны? Если я удаляю пользователя, мне нужно будет пройти по всем базам и удалить всё что ссылалось на него.
Какбе ебать у тебя базы независимы, для галочки. А по факту очень зависимы.
>При том что на каждый запрос будет JOIN который скомпонует данные из нескольких источников.
Можешь раскрыть мысль?
>Ёпта, ну элементарно обнови ID у пользователя в постгре и у тебя всё посыпиться.
Primary key меняют? Реально?
>Нельзя удалить пользователя, чтобы при этом не остались "мёртвые" ссылки в других базах. И что что они уникальны? Если я удаляю пользователя, мне нужно будет пройти по всем базам и удалить всё что ссылалось на него.
Ну если б я их сделал в виде таблиц, было б ровно тоже самое. И насколько я знаю, реально никто не удаляет, просто флажок делают, мол удалено.
>Какбе ебать у тебя базы независимы, для галочки. А по факту очень зависимы.
Окей, тогда в twistes можно хранить метаданные по конкретной лотерее. А все связи сделать в другой табличке, где будет связь id users один ко многим user, и document один к одному id из бд twistes
create table twistes (
id identity primary key,
user int not null,
document varchar(25) not null
);
А invites хз, мб проще просто перенести все в табличку отдельную, но отслеживать дерево связей, возможно, будет запарнее. Надо подумать. По крайней мере с twistes уже лучше?
Надо понимать ты не ответишь? Ну хотя бы пасиба за это.
Ой не неси пургу, твоё решение говно. Заставить бы тебя поддерживать этот проект хотя бы год. Естественно тебе похуй, ты поднял свой петпроект и снёс через день. Главный фейл в том, что ты мешаешь кислое с пресным. Реляционные и nosql базы в одном проекте это как быть поклонником минимал техно и Верки Сердючки одновременно. У реляционок жёсткая структура данных, ты не можешь добавить юзеру новые поля пока не сделаешь `alter table`. Соответственно, тебе придётся ебаться с миграциями. Но зато, ты получишь бОльшую гибкость запросов. Непонятно, зачем здесь нужна большая гибкость? У тебя максимум будет 4 операции - create user, get user, update user, delete user, ВСЁ! Монга здесь прекрасно бы справилась. Непонятно какую глубокомысленную идею ты преследуешь добавляя постгрю? Она будет работать тупо на CRUD. Ок, даже сортировать по таймстампу! Тоже самое с neo4j. Здесь нет никаких ни many-to-many отношений, чтобы нужны были графы. Ты придумал лишнюю ебатню, чтобы при каждом чихе нужно было ходить в другие ДБ и обновлять данные. Это будет добавлять лишнее latency и нужно будет это гасить кешированием.
Короче, из всех баз данных можно было оставить одну монгу. Сделать single collection design https://www.mongodb.com/developer/products/mongodb/mongodb-schema-design-best-practices/ и не разносить данные на пол-галактики.
>У тебя максимум будет 4 операции - create user, get user, update user, delete user, ВСЁ!
>Также есть возможность дебета и кредита между юзерами.
Точно ли многодокументные транзакции норма?
>Здесь нет никаких ни many-to-many отношений, чтобы нужны были графы.
Ну как, есть же инвайты. Соответственно будет дерево из юзеров.
Условно A пригласил B, C, D, а D в своюю очередь пригласил еще R, T. Пик крч. Если добавить обратные связи, скажем проценты, то получится пик 2. Не то, чтобы это нельзя было сделать через постргресс, мне просто хотелось попробовать neo4j....
>Короче, из всех баз данных можно было оставить одну монгу.
Мне вообще не нравятся nosql бд, я лучше оставлю реляционную.
> Ой не неси пургу, твоё решение говно.
В общем, поясните мне, пожалуйста, почему нельзя мешать nosql бд и релиционные.
По идее редис же есть, для кэширования данных ну или кафка, для консумеров и продусеров. Или это совершенно другое?
В общем-то с той связью, что у меня, будет абсолютно наплевать удаляется метаданные или же нет. Можно будет выводить типа, срок хранения истёк ну или что-то подобное. Ещё можно повесить срок жизни на метаданные, так если и удаляется данные, они в любом случае умрут, вне зависимости от того, что там в реляционной. Единственная проблема будет, если кто-то изменит id в документах и возникнет неконсистентность данных. Я хз, возможно ли такое...
>Заставить бы тебя поддерживать этот проект хотя бы год.
Да похуй, ты главное деньги плати, я-т любое говно поддерживать готов.
Окей, я и не претендовал на знания, тк ни разу не видел ни одной архитектуры. Так или иначе, обязательно надо выебнуться, что ты не такой и вообще выше всего этого?
Вот, к примеру, типичная задача, где надо что-то посчитать и положить результаты во вспомогательную мапу, а потом по этим данным как-то отфильтровать входящие данные.
Циклами такие задачки решаются элементарно. А вот через стрим апи голову сломать можно. Надо как-то вывернуться, насрать в поток какого-то маловразумительно говна, потом написать действие, которое это говно соберёт и склеит с нужными данными.
Зачем так нужно извращаться?
>Правда ли, что сейчас нельзя писать циклы и надо всё сводить к стрим апи?
Запрещать циклы - шиза ебаная. Обычно она бывает у тех, кто перекурил какого нибудь хаскелля, где циклов нет и все делается через всякие мапфолдредьюсы по коллекциям, и теперь косплеит функциональщину в жаве любой ценой нахуй. Не надо так.
На самом деле стрим апи и циклы работают по разному и имеют разный сет достоинств-недостатков. Стримы можно параллелить, циклы - нет (чх, фанатики параллелят их редко). Стримы предоставляют понятный читабельный паттерн мап-редьюс, циклы - нет. В то же время итерации циклов, в отличие от лямбд стримов, можно замыкать на мутабельную переменную, что бывает удобно. Более того - циклы просты и предсказуемы как палка, в то время как по стримам у Тагира Валеева есть два доклада с их "причудами" и один опенсорцный либ StreamEx, дополняющий и исправляющий недостатки оригинальных стримов.
Да я напиздел.
Jvm невозможно постичь не обратившись в рясу схимника
Че ебало скривил? Первоисточник всегда лучше всего остального. Делов то - открыть идею и посмотреть небольшой пучок сорцов.
Похуй.
Пруф.
Там есть бесплатный плагин на 3.5
Хахаха, что за книга?
Только если в тестовом пакедже заэкстендиться со своим конструктором.
А что значит - "только для тестов", философски говоря? Тесты - просто частный случай переиспользования сущности под тестом, ни больше ни меньше. Да и что есть тест, если не формализация какого то кейса, который может случиться с тестируемой сущностью в проде? Учитывая вышеозвученные риторические вопросы, ответь - почему дополнительный конструктор, объявленный для сущности, должен и может быть только конструктором для тестов?
По совести, должно быть однохуйственно что это за конструктор. Если по какой то причине это у тебя не так, значит получилась хуйня скорее всего. Давай больше деталей.
Бесполезный мясной мешок обосрался на тесте Тьюринга
Это копия, сохраненная 28 июля 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.