Яндекс это же сайт, что я там буду делать?
Разговор с тимлидом команды Serverless Yandex Cloud про продуктовые исследования, фичеборды, виртуальные команды и топ-качества разработчиков.
Смотрите выпуск на YouTube канале Yandex Cloud ➡️
00:00 Приветствие
01:19 Как держать темп разработки в распределенной команде?
03:29 Про то, как работают виртуальные команды
07:50 Как получается удержать экспертизу в команде?
10:04 Про продуктовые исследования
15:04 Про работу с сообществом и custdev
19:23 Про фичеборд и голосование
23:35 Продукт для разработчиков
24:24 Про вклад стажёров в развитие продукта
28:18 "Яндекс это же сайт, что я там буду делать?" путь Андрея в Яндексе
30:45 Топ-качества разработчиков команды Serverless
35:02 Про плов и то, что объединяет
Разговор с тимлидом команды Serverless Yandex Cloud про продуктовые исследования, фичеборды, виртуальные команды и топ-качества разработчиков.
Смотрите выпуск на YouTube канале Yandex Cloud ➡️
00:00 Приветствие
01:19 Как держать темп разработки в распределенной команде?
03:29 Про то, как работают виртуальные команды
07:50 Как получается удержать экспертизу в команде?
10:04 Про продуктовые исследования
15:04 Про работу с сообществом и custdev
19:23 Про фичеборд и голосование
23:35 Продукт для разработчиков
24:24 Про вклад стажёров в развитие продукта
28:18 "Яндекс это же сайт, что я там буду делать?" путь Андрея в Яндексе
30:45 Топ-качества разработчиков команды Serverless
35:02 Про плов и то, что объединяет
YouTube
Команда Serverless в Yandex Cloud, топ-качества разработчиков
Сегодня говорим про продуктовые исследования, фичеборды, виртуальные команды и топ-качества разработчиков команды бессерверных вычислений в Yandex Cloud.
Смотрите новый выпуск подкаста "Про людей".
00:00 Приветствие
01:19 Как держать темп разработки в…
Смотрите новый выпуск подкаста "Про людей".
00:00 Приветствие
01:19 Как держать темп разработки в…
👍8🔥1
Какой класс в Spring отвечает за анализ входящих http-запросов и их направления в определенный контроллер?
В Spring за "разведение" http-запросов по соответствующим контейнерам отвечает класс DispatcherServlet. После получения запроса DispatcherServlet обращается к интерфейсу HandlerMapping, который и рассказывает DispatcherServlet какой именно котроллер отвечает за этот запрос. После обращения к контреллеру DispatcherServlet, получивший имя представления(View), обращается к ViewResolver для получения View по его имени. После создания View DispatcherServlet отправляет данные Модели в View который и отобразится в браузере.
В Spring за "разведение" http-запросов по соответствующим контейнерам отвечает класс DispatcherServlet. После получения запроса DispatcherServlet обращается к интерфейсу HandlerMapping, который и рассказывает DispatcherServlet какой именно котроллер отвечает за этот запрос. После обращения к контреллеру DispatcherServlet, получивший имя представления(View), обращается к ViewResolver для получения View по его имени. После создания View DispatcherServlet отправляет данные Модели в View который и отобразится в браузере.
👍39
Как исправить этот код, чтобы он вывел "I Love Programming Tests" корректно?
Anonymous Quiz
9%
Надо внутри while добавить i++ в конце, иначе будет бесконечный цикл.
7%
Надо в System.out.print передавать text[i].
11%
Надо объявить int i = 0.
73%
Надо выполнить все предыдущие пункты для корректной работы программы.
🥱32👍10😁9👌1🌚1
Что такое Spring Security? В чем разница между авторизацией и аутентификацией?
Spring Security - часть Spring Framework представляющий механизмы для контроля за авторизацией пользователей. Для управления Spring Security необходимо создать конфигурационный класс-наследник WebSecurityAdapter.
Аутентификация - процедура проверки подлинности, например проверка подлинности пользователя путем сравнения введенного им пароля с паролем, сохраненным в базе данных
Авторизация - предоставление определенному лицу или группе лиц прав на выполнение определенных действий.
Spring Security - часть Spring Framework представляющий механизмы для контроля за авторизацией пользователей. Для управления Spring Security необходимо создать конфигурационный класс-наследник WebSecurityAdapter.
Аутентификация - процедура проверки подлинности, например проверка подлинности пользователя путем сравнения введенного им пароля с паролем, сохраненным в базе данных
Авторизация - предоставление определенному лицу или группе лиц прав на выполнение определенных действий.
👍23🥱1
Дайте определение понятию “процесс”
Процесс — это совокупность кода и данных, разделяющих общее виртуальное адресное пространство. Процессы изолированы друг от друга, поэтому прямой доступ к памяти чужого процесса невозможен (взаимодействие между процессами осуществляется с помощью специальных средств). Для каждого процесса ОС создает так называемое «виртуальное адресное пространство», к которому процесс имеет прямой доступ. Это пространство принадлежит процессу, содержит только его данные и находится в полном его распоряжении. Операционная система же отвечает за то, как виртуальное пространство процесса проецируется на физическую память.
Процесс — это совокупность кода и данных, разделяющих общее виртуальное адресное пространство. Процессы изолированы друг от друга, поэтому прямой доступ к памяти чужого процесса невозможен (взаимодействие между процессами осуществляется с помощью специальных средств). Для каждого процесса ОС создает так называемое «виртуальное адресное пространство», к которому процесс имеет прямой доступ. Это пространство принадлежит процессу, содержит только его данные и находится в полном его распоряжении. Операционная система же отвечает за то, как виртуальное пространство процесса проецируется на физическую память.
👍10
Расскажите про прокси и про @Transactional. Как работает и зачем? Какие могут быть проблемы? Можно ли навесить @Transactional на приватный метод? А если вызывать метод с @Transactional внутри другого метода с @Transactional одного класса - будет работать?
Допустим, что наш сервис MyServiceImpl имеет 2 публичных метода, аннотированных @Transactional — method1 и method2(он с Propagation.REQUIRES_NEW). В method1 вызываем method2.
В связи с тем, что для поддержки транзакций через аннотации используется Spring AOP, в момент вызова method1() на самом деле вызывается метод прокси объекта. Создается новая транзакция и далее происходит вызов method1() класса MyServiceImpl. А когда из method1() вызовем method2(), обращения к прокси нет, вызывается уже сразу метод нашего класса и, соответственно, никаких новых транзакций создаваться не будет.
Допустим, что наш сервис MyServiceImpl имеет 2 публичных метода, аннотированных @Transactional — method1 и method2(он с Propagation.REQUIRES_NEW). В method1 вызываем method2.
В связи с тем, что для поддержки транзакций через аннотации используется Spring AOP, в момент вызова method1() на самом деле вызывается метод прокси объекта. Создается новая транзакция и далее происходит вызов method1() класса MyServiceImpl. А когда из method1() вызовем method2(), обращения к прокси нет, вызывается уже сразу метод нашего класса и, соответственно, никаких новых транзакций создаваться не будет.
👍16🔥3
Где у обычного (НЕ Boot) Spring-приложения main-класс?
Старое доброе обычное Spring-приложение деплоится в контейнер сервлетов (или сервер приложений), где и расположен main-класс. При этом оно собирается в war-архив. Когда war-файл разворачивается в контейнере, контейнер обычно распаковывает его для доступа к файлам, а затем запускает приложение. Spring Boot приложение также можно собрать как war и задеплоить его таким же образом.
Старое доброе обычное Spring-приложение деплоится в контейнер сервлетов (или сервер приложений), где и расположен main-класс. При этом оно собирается в war-архив. Когда war-файл разворачивается в контейнере, контейнер обычно распаковывает его для доступа к файлам, а затем запускает приложение. Spring Boot приложение также можно собрать как war и задеплоить его таким же образом.
👍20
Дайте определение понятию “синхронизация потоков”.
Синхронизация относится к многопоточности. Синхронизированный блок кода может быть выполнен только одним потоком одновременно.
Java поддерживает несколько потоков для выполнения. Это может привести к тому, что два или более потока получат доступ к одному и тому же полю или объекту. Синхронизация — это процесс, который позволяет выполнять все параллельные потоки в программе синхронно. Синхронизация позволяет избежать ошибок согласованности памяти, вызванных непоследовательным доступом к общей памяти.
Когда метод объявлен как синхронизированный — нить держит монитор для объекта, метод которого исполняется. Если другой поток выполняет синхронизированный метод, ваш поток заблокируется до тех пор, пока другой поток не отпустит монитор.
Синхронизация достигается в Java использованием зарезервированного слова synchronized. Вы можете использовать его в своих классах определяя синхронизированные методы или блоки. Вы не сможете использовать synchronized в переменных или атрибутах в определении класса.
Синхронизация относится к многопоточности. Синхронизированный блок кода может быть выполнен только одним потоком одновременно.
Java поддерживает несколько потоков для выполнения. Это может привести к тому, что два или более потока получат доступ к одному и тому же полю или объекту. Синхронизация — это процесс, который позволяет выполнять все параллельные потоки в программе синхронно. Синхронизация позволяет избежать ошибок согласованности памяти, вызванных непоследовательным доступом к общей памяти.
Когда метод объявлен как синхронизированный — нить держит монитор для объекта, метод которого исполняется. Если другой поток выполняет синхронизированный метод, ваш поток заблокируется до тех пор, пока другой поток не отпустит монитор.
Синхронизация достигается в Java использованием зарезервированного слова synchronized. Вы можете использовать его в своих классах определяя синхронизированные методы или блоки. Вы не сможете использовать synchronized в переменных или атрибутах в определении класса.
👍15
Что выведет следующий код?
Anonymous Quiz
33%
0-0 0-1 1-0 1-1 2-0 2-1
15%
0-0 0-1 0-2 1-0 1-1 1-2 2-0 2-1 2-2
42%
Бесконечный вывод «0-0 0-1»
10%
0-0 0-1
👍22
Какие есть кэши в Hibernate и какие работают по умолчанию?
3 уровня кеширования:
• Кеш первого уровня (First-level cache). По умолчанию включен.
• Кеш второго уровня (Second-level cache). По умолчанию отключен.
• Кеш запросов (Query cache). По умолчанию отключен.
3 уровня кеширования:
• Кеш первого уровня (First-level cache). По умолчанию включен.
• Кеш второго уровня (Second-level cache). По умолчанию отключен.
• Кеш запросов (Query cache). По умолчанию отключен.
👍21
Чем отличается Lazy от Eager в Hibernate?
• Eager Loading — стратегия загрузки, при которой подгрузка связанных сущностей происходит сразу. Для применения необходимо в аннотацию отношения (@OneToOne, @ManyToOne, @OneToMany, @ManyToMany) передать fetch = FetchType.EAGER. Используется по умолчанию для отношений @OneToOne и @ManyToOne.
• Lazy Loading — стратегия загрузки, при которой подгрузка связанных сущностей откладывается как можно дольше. Чтобы задать такое поведение, нужно в аннотацию отношения (@OneToOne, @ManyToOne, @OneToMany, @ManyToMany) передать fetch = FetchType.LAZY. Используется по умолчанию для отношений @OneToMany, @ManyToMany. До момента загрузки используется proxy-объект, вместо реального. Если обратиться к такому LAZY-полю после закрытия сессии Hibernate, то получим LazyInitializationException.
• Eager Loading — стратегия загрузки, при которой подгрузка связанных сущностей происходит сразу. Для применения необходимо в аннотацию отношения (@OneToOne, @ManyToOne, @OneToMany, @ManyToMany) передать fetch = FetchType.EAGER. Используется по умолчанию для отношений @OneToOne и @ManyToOne.
• Lazy Loading — стратегия загрузки, при которой подгрузка связанных сущностей откладывается как можно дольше. Чтобы задать такое поведение, нужно в аннотацию отношения (@OneToOne, @ManyToOne, @OneToMany, @ManyToMany) передать fetch = FetchType.LAZY. Используется по умолчанию для отношений @OneToMany, @ManyToMany. До момента загрузки используется proxy-объект, вместо реального. Если обратиться к такому LAZY-полю после закрытия сессии Hibernate, то получим LazyInitializationException.
👍25
Что выведет следующий код?
Anonymous Quiz
30%
Произойдет ошибка компиляции
24%
Во время исполнения возникнет исключение NullPointerException
38%
null
8%
1
👍28😢4🥴3
Как описать составной ключ при использовании Hibernate?
На всякий случай: составной ключ — первичный ключ, состоящий из двух и более атрибутов.
Чтобы описать составной ключ при использовании Hibernate, нам необходимо создать под этот ключ отдельный класс с необходимыми полями и добавить ему аннотацию @Embeddable. Кроме того, он должен быть Serializable и иметь реализацию equals и hashcode.
В самой же сущности, для которой мы описываем составной ключ, добавляем поле только что созданного класса ключа и вешаем на него аннотацию @EmbeddedId.
На всякий случай: составной ключ — первичный ключ, состоящий из двух и более атрибутов.
Чтобы описать составной ключ при использовании Hibernate, нам необходимо создать под этот ключ отдельный класс с необходимыми полями и добавить ему аннотацию @Embeddable. Кроме того, он должен быть Serializable и иметь реализацию equals и hashcode.
В самой же сущности, для которой мы описываем составной ключ, добавляем поле только что созданного класса ключа и вешаем на него аннотацию @EmbeddedId.
👍28
👍26🤨10😢7🏆2🌚1
Как можно отобразить наследование на БД с помощью JPA (Hibernate)?
Есть 4 способа отобразить наследование на БД с помощью JPA (Hibernate):
• MappedSuperclass — поля родителя содержатся в каждой таблице для каждого дочернего класса. Базовый класс отдельной таблицы не имеет. На базовый класс навешиваем @MappedSuperClass, а вот на дочерние @Entity. Если в таблице потомка поле родителя называется не так, как указано в родительском классе, то его нужно смаппить с помощью аннотации @AttributeOverride в классе этого потомка. Родитель не может участвовать в ассоциации. При полиморфных запросах у нас будут отдельные запросы для каждой таблицы.
• Single table — вся иерархия классов в одной таблице. Чтобы различать классы, необходимо добавить колонку-дискриминатор. В данной стратегии на родительский @Entity-класс навешивается @Inheritance(strategy = InheritanceType.SINGLE_TABLE) и @DiscriminatorColumn(name = "YOUR_DISCRIMINATOR_COLUMN_NAME") (по умолчанию имя колонки DTYPE и тип VARCHAR). В каждом подклассе указываем @DiscriminatorValue("ThisChildName") со значением, которое будет храниться в колонке-дискриминаторе для данного класса. Если нет возможности добавить колонку, то можно использовать аннотацию @DiscriminatorFormula, в которой указать выражение CASE...WHEN — это не по JPA, фишка Hibernate. Денормализация. Простые запросы к одной таблице. Возможное нарушение целостности — столбцы подклассов могут содержать NULL.
• Joined table — отдельные таблицы для всех классов иерархии, включая родителя. В каждой таблице только свои поля, а в дочерних добавляется внешний (он же первичный) ключ для связи с родительской таблицей. В @Entity-класс родителя добавляем @Inheritance(strategy = InheritanceType.JOINED). Для полиморфных запросов используются JOIN, а также выражение CASE...WHEN, вычисляющее значение поля _clazz, которое заполняется литералами (0 (родитель), 1, 2 и т.д.) и помогает Hibernate определить какого класса будет экземпляр.
• Table per class — также как и в MappedSuperclass, имеем отдельные таблицы для каждого подкласса. Базовый класс отдельной таблицы не имеет. По спецификации JPA 2.2 данная стратегия является опциональной, но в Hibernate реализована, поэтому продолжим. В данном случае на базовый класс мы навешиваем @Entity и @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS). Поле первичного ключа (@Id) обязательно для родительского класса. Также аннотация @AttributeOverride в этой стратегии не работает — называйте родительские поля в таблицах сразу единообразно. Полиморфный запрос будет использовать UNION для объединения таблиц. Чтобы различить при создании экземпляров подклассы, Hibernate добавляет поле _clazz в запросы, содержащие литералы (1, 2 и т.д.). А одинаковый набор столбцов для объединения добирается как NULL AS some_field. Родитель может участвовать в ассоциации с другими сущностями.
Есть 4 способа отобразить наследование на БД с помощью JPA (Hibernate):
• MappedSuperclass — поля родителя содержатся в каждой таблице для каждого дочернего класса. Базовый класс отдельной таблицы не имеет. На базовый класс навешиваем @MappedSuperClass, а вот на дочерние @Entity. Если в таблице потомка поле родителя называется не так, как указано в родительском классе, то его нужно смаппить с помощью аннотации @AttributeOverride в классе этого потомка. Родитель не может участвовать в ассоциации. При полиморфных запросах у нас будут отдельные запросы для каждой таблицы.
• Single table — вся иерархия классов в одной таблице. Чтобы различать классы, необходимо добавить колонку-дискриминатор. В данной стратегии на родительский @Entity-класс навешивается @Inheritance(strategy = InheritanceType.SINGLE_TABLE) и @DiscriminatorColumn(name = "YOUR_DISCRIMINATOR_COLUMN_NAME") (по умолчанию имя колонки DTYPE и тип VARCHAR). В каждом подклассе указываем @DiscriminatorValue("ThisChildName") со значением, которое будет храниться в колонке-дискриминаторе для данного класса. Если нет возможности добавить колонку, то можно использовать аннотацию @DiscriminatorFormula, в которой указать выражение CASE...WHEN — это не по JPA, фишка Hibernate. Денормализация. Простые запросы к одной таблице. Возможное нарушение целостности — столбцы подклассов могут содержать NULL.
• Joined table — отдельные таблицы для всех классов иерархии, включая родителя. В каждой таблице только свои поля, а в дочерних добавляется внешний (он же первичный) ключ для связи с родительской таблицей. В @Entity-класс родителя добавляем @Inheritance(strategy = InheritanceType.JOINED). Для полиморфных запросов используются JOIN, а также выражение CASE...WHEN, вычисляющее значение поля _clazz, которое заполняется литералами (0 (родитель), 1, 2 и т.д.) и помогает Hibernate определить какого класса будет экземпляр.
• Table per class — также как и в MappedSuperclass, имеем отдельные таблицы для каждого подкласса. Базовый класс отдельной таблицы не имеет. По спецификации JPA 2.2 данная стратегия является опциональной, но в Hibernate реализована, поэтому продолжим. В данном случае на базовый класс мы навешиваем @Entity и @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS). Поле первичного ключа (@Id) обязательно для родительского класса. Также аннотация @AttributeOverride в этой стратегии не работает — называйте родительские поля в таблицах сразу единообразно. Полиморфный запрос будет использовать UNION для объединения таблиц. Чтобы различить при создании экземпляров подклассы, Hibernate добавляет поле _clazz в запросы, содержащие литералы (1, 2 и т.д.). А одинаковый набор столбцов для объединения добирается как NULL AS some_field. Родитель может участвовать в ассоциации с другими сущностями.
👍28