Как стать автором
Обновить
0
0

Пользователь

Отправить сообщение

Раздельное логгирование методов в Java/logback

Время на прочтение5 мин
Количество просмотров24K

Bart writing some logs


Задача


Допустим, нам захотелось логгировать каждый метод некого Java-класса по разному:


  • Для каждого метода свой лог-файл,
  • … свой формат лога,
  • … свой минимальный уровень логгирования,
  • формат лога расширяем собственными %переменными,
  • возможность обновлять эту конфигурацию на лету.
Читать дальше →
Всего голосов 12: ↑10 и ↓2+8
Комментарии6

Уровни изолированности транзакций для самых маленьких

Время на прочтение5 мин
Количество просмотров260K


Сегодня хотел бы довести крайне интересный, но часто покрытый тайнами для обычных смертных программистов раздел базы данных (БД) — уровни изолированности транзакций. Как показывает практика, многие люди, связанные с IT, в частности с работой с БД, слабо понимают зачем нужны эти уровни и как их можно использовать себе во благо.

Немного теории


Сами транзакции особых объяснений не требуют, транзакция — это N (N≥1) запросов к БД, которые выполнятся успешно все вместе или не выполнятся вовсе. Изолированность же транзакции показывает то, насколько сильно влияют друг на друга параллельно выполняющиеся транзакции.
Выбирая уровень транзакции, мы пытаемся прийти к консенсусу в выборе между высокой согласованностью данных между транзакциями и скоростью выполнения этих самых транзакций.
Стоит отметить, что самую высокую скорость выполнения и самую низкую согласованность имеет уровень read uncommitted. Самую низкую скорость выполнения и самую высокую согласованность — serializable.
Читать дальше →
Всего голосов 42: ↑36 и ↓6+30
Комментарии17

Собеседование Backend-Java-разработчика: вопросы и где искать ответы. Часть 1

Время на прочтение34 мин
Количество просмотров91K

Когда-то я проходил серию собеседований на Backend-Java-разработчика и записывал вопросы себе на будущее, чтобы потом можно было пробежаться и освежить память. Подумалось, что, вероятно, данный сборник будет полезен не только мне, поэтому сдул с него пыль, набросал ответов и делюсь с сообществом. На оригинальность и исключительность не претендую: подобные статьи уже были и на Хабре, и много где ещё — в конце (во второй части) приведу список ссылок, чтобы шпаргалка была максимально полной.


Точно установить сложность всех вопросов не берусь — на разном уровне их потребуется раскрыть с различной степенью подробности. Я написал ответы где-то на плюс-минус middle, щедро приправив ссылками для дальнейших изысканий. На самые популярные вопросы сразу перенаправляю в источники с готовыми ответами. Заодно посмотрим по ссылкам в статье, насколько Хабр может помочь в подготовке к собесам.


Текста получилось много, поэтому пришлось разбить на две части. В первой поговорим про Java и Spring, а обо всём остальном — во второй. Вторая часть тут

Погнали
Всего голосов 13: ↑11 и ↓2+13
Комментарии7

Подключение Keycloak к Spring Boot приложению

Время на прочтение20 мин
Количество просмотров70K

Привет Хабр!

Как известно, spring OAuth2.0.x переведен в режим поддержки уже почти как 2 года назад , а большая часть его функциональности теперь доступна в spring-security (матрица сопоставления). В spring-security отказались переносить Authorization service (roadmap) и предлагают использовать вместо него свободные или платные аналоги, в частности keycloak. В этом посте мы хотели бы поделится различными вариантами подключения keycloak к приложениям spring-boot.

Читать далее
Всего голосов 10: ↑10 и ↓0+10
Комментарии13

Kubernetes NodePort vs LoadBalancer vs Ingress? Когда и что использовать?

Время на прочтение4 мин
Количество просмотров75K


Недавно меня спросили, в чем разница между NodePorts, LoadBalancers и Ingress. Все это разные способы получить внешний трафик в кластер. Давайте посмотрим, чем они отличаются, и когда использовать каждый из них.


Примечание: рекомендации рассчитаны на Google Kubernetes Engine. Если вы работаете в другом облаке, на собственном сервере, на миникубе или чем-то еще, будут отличия. Я не углубляюсь в технические детали. Если хотите подробностей, обратитесь к официальной документации.

Читать дальше →
Всего голосов 9: ↑9 и ↓0+9
Комментарии7

Подготовка к Spring Professional Certification. Контейнер, IoC, бины

Время на прочтение10 мин
Количество просмотров110K

Доброго времени суток, Хабр.


Сегодня я решил представить вам перевод цикла статей для подготовки к Spring Professional Certification.


Это перевод только первой статьи, если он зайдет аудитории, я продолжу выпуск переводов.  


Зачем я это делаю, ведь уже есть куча профильных материалов?
  1. Часто в них информация не структурирована, не собрана, или не актуальна
  2. Молодые разработчики могут не знать английский. Этот цикл можно использовать не только для сертификации, но и для самообучения/повторения материалов.
  3. Этими материалами можно пользоваться при подготовке к собеседованию, т.к. они выстроены в виде вопросов и ответов.
  4. Важное, и самое главное преимущество — этот QA сделан из вопросов из  официального Study Guide от Pivotal. 

  • Некоторые вопросы, которые казались мне лишними или которых не было в гиде я осознанно упустил.

Оглавление
  1. Внедрение зависимостей, контейнер, IoC, бины
  2. AOP (аспектно-ориентированное программирование)
  3. JDBC, транзакции, JPA, Spring Data
  4. Spring Boot
  5. Spring MVC
  6. Spring Security
  7. REST
  8. Тестирование

Читать дальше →
Всего голосов 30: ↑29 и ↓1+28
Комментарии53

Туториал: Реактивный Spring Boot

Время на прочтение8 мин
Количество просмотров8.5K
В прошлом месяце Trisha Gee (JetBrains) представила на SpringOne демонстрацию создания приложения, отображающего стоимость акций в реальном времени, с использованием Spring Boot, Kotlin и JavaFX. Демонстрация в режиме реального времени была записана и доступна в виде 70-минутного видео.

18 декабря Trisha завершила публикацию на сайте dzone.com туториала про реактивный Spring Boot на основе указанного видео, в виде серии более коротких видеороликов с сопровождающим сообщением в блоге, объясняющих каждый из шагов более медленно и более подробно.

У меня появилась мысль перевести этот туториал на русский язык. Однако на мой запрос об этом Trisha ответила вежливым отказом:
«Let me check with my organisation. I would love to have it translated but we might have a prefered way to get things translated.»

Поэтому я решил ограничиться обзором этого туториала, включающего следующую серию уроков:
Читать дальше →
Всего голосов 4: ↑3 и ↓1+4
Комментарии0

Некоторые тонкости injection'а коллекций в Spring'е

Время на прочтение4 мин
Количество просмотров28K
Всем привет! Меня зовут Владислав Родин. В настоящее время я преподаю на портале OTUS курсы, посвященные архитектуре ПО и архитектуре ПО, подверженного высокой нагрузке. Сейчас в OTUS'е открыт набор на новый поток курса Разработчик на Spring Framework. В преддверии старта курса я решил написать небольшой авторский материал, которым хочу поделиться с вами.





Предыстория


Spring содержит внутри себя много «магии», осуществляя самостоятельно некоторые неочевидные вещи. Незнание или непонимание этого может приводить к side-эффектам, с которыми вы можете столкнуться в процессе написания своего приложения, используя данный framework.

Одной из таких неочевидных вещей является injection интерфейсов Java Collection Framework'а. Самостоятельно наступив на грабли, связанные с этой темой, и услышав очередные вопросы от коллег, я решил с ней разобраться и зафиксировать результаты своих исследований в виде статьи с надеждой, что она кому-то поможет уже в работе или при начальном освоении Spring'а.
Читать дальше →
Всего голосов 24: ↑16 и ↓8+14
Комментарии19

Коллекции в Java: о чём многие забывают

Время на прочтение6 мин
Количество просмотров142K
Из опыта code-review и ответов на StackOverflow набралось немало моментов, касающихся Java Collections API, которые мне казались очевидными, но другие разработчики о них почему-то не знали или знали, но не чувствовали уверенности их применять. В этой статье я собираю в общую кучу всё, что накопилось.

Содержание:


  1. List.subList
  2. PriorityQueue
  3. EnumSet и EnumMap
  4. Set.add(E) и Set.remove(E) возвращают булево значение
  5. Map.put(K, V), Map.remove(K), List.set(idx, E), List.remove(idx) возвращают предыдущий элемент
  6. Map.keySet() и Map.values()
  7. Arrays.asList может быть ключом
  8. Collections.max
  9. LinkedList, Stack, Vector, Hashtable
Читать дальше →
Всего голосов 58: ↑57 и ↓1+56
Комментарии37

Что мы делаем не так со Спрингом

Время на прочтение9 мин
Количество просмотров13K

В этой заметке хочу поделится наблюдениями о некоторых антипаттернах, встречающихся в коде приложений, работающих на Спринге. Все из них так или иначе всплывали в живом коде: либо я натыкался на них в уже существующих классах, либо вылавливал во время вычитки творчества коллег.


Надеюсь, вам будет интересно, а если после прочтения вы осознаете свои "грехи" и встанете на путь исправления, то я буду доволен вдвойне. Также призываю вас поделится своими собственными примерами в комментария, наиболее любопытные и необычные добавим в запись.

Читать дальше →
Всего голосов 19: ↑15 и ↓4+11
Комментарии81

Теории вероятностей: готовимся к собеседованию и разрешаем «парадоксы»

Время на прочтение17 мин
Количество просмотров93K

Каждый год я участвую примерно в сотне собеседований в образовательных проектах JetBrains: собеседую абитуриентов в Computer Science Center и корпоративную магистратуру ИТМО (кстати, набор на программу идёт прямо сейчас). Все собеседования устроены по одному шаблону: мы просим на месте порешать задачи и задаём базовые вопросы по дисциплинам, которые студенты изучали в университетах. Большинство вопросов, которые мы задаём, довольно простые — нужно дать определение некоторого понятия, сформулировать свойство или теорему. К сожалению, у значительной доли студентов все эти определения выветриваются сразу после экзаменов в университетах. Казалось бы, что тут удивительного? В современном мире любое определение можно за пару секунд нагуглить, если это нужно. Но невозможность восстановить базовое определение свидетельствует о непонимании сути предмета.

Если непонимание алгебры или математического анализа может мало влиять на вашу жизнь, то непонимание теории вероятностей делает из вас лёгкую мишень для обмана и манипулирования. Суждения о вероятностях различных событий настолько глубоко вошли в нашу повседневную жизнь, что умение правильно рассуждать и отличать правду от невежества или манипуляции является необходимым. В этом небольшом обзоре мы поговорим о базовых понятиях теории вероятностей, научимся правильно формулировать утверждения про простые случайные процессы и разберём несколько парадоксов. Часть материала позаимствована из брошюры А. Шеня «Вероятность: примеры и задачи», которую я очень рекомендую для самостоятельного изучения.
Читать дальше →
Всего голосов 15: ↑12 и ↓3+17
Комментарии101

Понимание джойнов сломано. Это точно не пересечение кругов, честно

Время на прочтение4 мин
Количество просмотров336K

Так получилось, что я провожу довольно много собеседований на должность веб-программиста. Один из обязательных вопросов, который я задаю — это чем отличается INNER JOIN от LEFT JOIN.


Чаще всего ответ примерно такой: "inner join — это как бы пересечение множеств, т.е. остается только то, что есть в обеих таблицах, а left join — это когда левая таблица остается без изменений, а от правой добавляется пересечение множеств. Для всех остальных строк добавляется null". Еще, бывает, рисуют пересекающиеся круги.


Я так устал от этих ответов с пересечениями множеств и кругов, что даже перестал поправлять людей.


Дело в том, что этот ответ в общем случае неверен. Ну или, как минимум, не точен.

Читать дальше →
Всего голосов 179: ↑138 и ↓41+97
Комментарии227

Тюнинг производительности запросов в PostgreSQL

Время на прочтение8 мин
Количество просмотров32K
Настройка производительности базы данных — разработчики обычно либо любят это, либо ненавидят. Я получаю удовольствие от этого и хочу поделиться некоторыми методами, которые я использовал в последнее время для настройки плохо выполняющихся запросов в PostgreSQL. Мои методы не является исчерпывающими, скорее учебником для тех, кто просто тащится от тюнинга.

Поиск медленных запросов


Первый очевидный способ начать тюнинг — это найти конкретные операторы, которые работают плохо.

pg_stats_statements


Модуль pg_stats_statements — отличное место для начала. Он просто отслеживает статистику выполнения операторов SQL и может быть простым способом поиска неэффективных запросов.

Как только вы установили этот модуль, системное представление с именем pg_stat_statements будет доступно со всеми своими свойствами. Как только у него будет возможность собрать достаточный объем данных, ищите запросы, которые имеют относительно высокое значение total_time. Сначала сфокусируйтесь на этих операторах.

SELECT *
FROM
  pg_stat_statements
ORDER BY
  total_time DESC;

user_id dbid queryid query calls total_time
16384 16385 2948 SELECT address_1 FROM addresses a INNER JOIN people p ON a.person_id = p.id WHERE a.state = @state_abbrev; 39483 15224.670
16384 16385 924 SELECT person_id FROM people WHERE name = name; 26483 12225.670
16384 16385 395 SELECT _ FROM orders WHERE EXISTS (select _ from products where is_featured = true) 18583 224.67

Читать дальше →
Всего голосов 22: ↑22 и ↓0+22
Комментарии7

RabbitMQ Spring tutorial

Время на прочтение21 мин
Количество просмотров109K
На сайте rabbitmq.com уже есть подробные примеры и клиент для java. Однако если в проекте уже используется спринг, то намного удобнее использовать библиотеку Spring AMQP. Эта статья содержит реализацию всех шести официальных примеров работы с RabbitMQ.
Читать дальше →
Всего голосов 11: ↑10 и ↓1+9
Комментарии0

О выборе структур данных для начинающих

Время на прочтение18 мин
Количество просмотров177K
image

Часть 1. Линейные структуры


Массив


Когда вам нужен один объект, вы создаёте один объект. Когда нужно несколько объектов, тогда есть несколько вариантов на выбор. Я видел, как многие новички в коде пишут что-то типа такого:

// Таблица рекордов
int score1 = 0;
int score2 = 0;
int score3 = 0;
int score4 = 0;
int score5 = 0;

Это даёт нам значение пяти рекордов. Этот способ неплохо работает, пока вам не потребуется пятьдесят или сто объектов. Вместо создания отдельных объектов можно использовать массив.

// Таблица рекордов
const int NUM_HIGH_SCORES = 5;
int highScore[NUM_HIGH_SCORES] = {0};

Будет создан буфер из 5 элементов, вот такой:



Заметьте, что индекс массива начинается с нуля. Если в массиве пять элементов, то они будут иметь индексы от нуля до четырёх.
Читать дальше →
Всего голосов 42: ↑40 и ↓2+38
Комментарии32

Структуры данных в картинках. HashMap

Время на прочтение6 мин
Количество просмотров1.2M
Приветствую вас, хабрачитатели!

Продолжаю попытки визуализировать структуры данных в Java. В предыдущих сериях мы уже ознакомились с ArrayList и LinkedList, сегодня же рассмотрим HashMap.



HashMap — основан на хэш-таблицах, реализует интерфейс Map (что подразумевает хранение данных в виде пар ключ/значение). Ключи и значения могут быть любых типов, в том числе и null. Данная реализация не дает гарантий относительно порядка элементов с течением времени. Разрешение коллизий осуществляется с помощью метода цепочек.

А почему бы и нет?
Всего голосов 81: ↑75 и ↓6+69
Комментарии42

Hibernate для самых маленьких и не только

Время на прочтение6 мин
Количество просмотров205K
Доброго всем времени суток! При написании программы, которая так или иначе будет взаимодействовать с базой данных, пользуются разными средствами. Это и старый добрый jdbc, также применяют: EclipseLink,TopLink, iBatis (уже MyBatis), Spring Framework и конечно же герой нашей статьи — Hibernate. Конечно я здесь перечислил не все средства работы с базой данных, но постарался указать самые распространенные. В данной статье будет показано, как при помощи Hibernate вызывать хранимые процедуры, маппить как таблицы, так и запросы к классам. В качестве подопытной базы данных возьмем Oracle.
Читать дальше →
Всего голосов 43: ↑40 и ↓3+37
Комментарии26

Как перебрать все перестановки и о факториальном разложении натуральных чисел

Время на прочтение3 мин
Количество просмотров28K
Задачи о переборе всех возможных перестановок заданного множества сущностей возникают в программировании достаточно часто. Как известно из комбинаторики, число возможных перестановок n предметов равно попросту факториалу числа n

n! = n * (n — 1) * (n – 2) * … * 3 * 2 * 1

Факториал – достаточно быстро растущая функция, об этом говорит ее асимптотика (формула Стирлинга), хотя достаточно посмотреть на факториалы нескольких первых членов натурального ряда:

1! 1
2! 2
3! 6
4! 24
5! 120
6! 720
7! 5 040
8! 40 320
9! 362 880
10! 3 628 800
11! 39 916 800
12! 479 001 600
13! 6 227 020 800
14! 87 178 291 200
15! 1 307 674 368 000

Как видно, факториал 13-ти уже не умещается в тип данных long.

Если задаться целью найти однозначное соответствие между номером перестановки — числом в диапазоне от 1 до n! – и ее реализацией, можно натолкнуться на один очень интересный математический факт.
Читать дальше →
Всего голосов 31: ↑30 и ↓1+29
Комментарии18

Основы Hibernate

Время на прочтение17 мин
Количество просмотров434K


Хочу начать со слов благодарности тому человеку, который мне вчера накинул кармы, позволив этим писать мне в персональный блог.

Долго думал, о чем же написать свой «первый» топик… Слово первый не зря взял в кавычки, так как первый топик на самом деле уже был, опыт был к сожалению неудачный — дело закончилось баном.  Решил больше не копипастить. Уверенности тому, что надо написать что-то свое, придал вот этот топик. Решил твердо — пусть это будет и редко, но буду писать сам.

Ну, едем дальше!

Совсем недавно, по роду свой деятельности, мне пришлось столкнуться с таким понятием как ORM — (англ. Object-relational mapping). В двух словах ORM — это отображение объектов какого-либо объектно-ориентированного языка в структуры реляционных баз данных. Именно объектов, таких, какие они есть, со всеми полями, значениями, отношениями м/у друг другом.
Читать дальше →
Всего голосов 64: ↑59 и ↓5+54
Комментарии112

Пара слов о числах с плавающей точкой в Java

Время на прочтение8 мин
Количество просмотров154K

Несколько дней назад мне на глаза попался занимательный такой вопрос, касающийся того, каков будет результат выполнения данного кода:
double a = 2.0 - 1.1;

или такого:
double f = 0.0;
for (int i=1; i <= 10; i++) {
	f += 0.1;
}

Вопреки всем моим ожиданиям, ответ: 0.89999999999999991 в первом случае и 0.99999999999999989 во втором.
Для тех, кто хочет узнать почему, а так же еще несколько занимательных фактов про этот тип данных, милости просим.

Читать дальше →
Всего голосов 84: ↑50 и ↓34+16
Комментарии32

Информация

В рейтинге
Не участвует
Откуда
Новосибирск, Новосибирская обл., Россия
Дата рождения
Зарегистрирован
Активность