OTUS IT News – Telegram
OTUS IT News
7.21K subscribers
4.33K photos
303 videos
5 files
4.3K links
Экспертный контент по востребованным технологиям 2025 года: от разработки и аналитики до искусственного интеллекта и облачных решений.

Более 170 курсов+

🗓 Расписание бесплатных ОУ: https://otus.pw/24Da/
🦉 Голосуй за канал: https://news.1rj.ru/str/boost/Otusjava
Download Telegram
3 июня у нас стартует второй курс по программе “Java разработчик”, в преддверии этого события мы приготовили обзор программы обучения - чем мы руководствовались и почему считаем ее актуальной?
Все что вы хотели знать, но боялись спросить о Java! :) 👇 https://habrahabr.ru/company/otus/blog/329458/
Напоминаем, что первый День открытых дверей пройдет уже завтра! Мы не только поговорим о проекте OTUS, программе обучения и перспективах для выпускников, но и по традиции разыграем среди успешно прошедших вступительное тестирование несколько бесплатных мест в новой Java группе.
Если вы еще не зарегистрировались и не прошли вступительное тестирование - самое время сделать это!
http://otus.ru/dod
На первом Дне открытых дверей состоялся розыгрыш бесплатных мест в новую Java группу!
Победителями стали: Егор Кузьмин и Сергей Жерновой.
Поздравляем ребят, ждем на занятиях, желаем успехов в обучении и новых карьерных высот!
Начинаем понедельник с отличных новостей! Наших лучших выпускников по курсам Java, C++, JavaScript на собеседование ждет еще одна компания - 1С.
Еще больше карьерных возможностей!
Что такое “углубленные основы”? В нашей программе есть такая тема. Что такое основы Java думаем, понятно. Например, цикл for или ветвление if-else или создание объекта через оператор new. Как основы могут быть “углубленными”?

Рассмотрим следующий базовый вопрос: как создать объект в Java? Первый и самый правильный ответ: через оператор new. Что может быть более базовым в объектно ориентированном языке, чем Object object = new Object();

Теперь усложним вопрос: Как создать объект в Java без использования new? И на этот вопрос есть два ответа: Reflection и клонирование.

Можно создать объект, если у вас есть объект класса Class<Т> этого класса:
Object instance = Class.forName("java.lang.Object").newInstance(); То есть вы можете получить новый объект класса зная только название этого класса (конечно если объект типа Class<T> для этого класса может быть загружен класс-лоадером).

Можно сделать класс Clonable и вызвать protected native Object clone() класса Object. В результате вы получите копию объекта, которую для вас сделает нативный метод.

Хорошо. Еще немного усложним задачу: как создать объект в Java не вызывая его конструктор? Кто сказал, что нельзя так сделать? Так работает ObjectOutputStream, когда десериализует объект. Вызывает sun.reflect.ReflectionFactory.newConstructorForSerialization()
Фактически создавая объект произвольного класса через вызов конструктора java.lang.Object

Что еще можно углубленно-базового рассмотреть? Вот, например, области видимости переменных: public, protected, private. Интересно что о них можно углубленного рассказать? Посмотрите sun.reflect.MagicAccessorImpl. Да-да magic accessor.
Завтра мы проведем еще один День открытых дверей по Java (последний перед началом обучения новой группы). Регистрируйтесь на http://otus.ru/dod?utm_source=telegram&utm_medium=internal&utm_campaign=dod2 и готовьте свои вопросы.
А поскольку мы по традиции разыграем бесплатное обучение - торопитесь скорее пройти вступительное тестирование, чтобы принять участие в розыгрыше!
Через считанные минуты начинаем трансляцию второго (и последнего) Дня открытых дверей!
Присоединяйтесь, задавайте вопросы, следите за розыгрышем бесплатного обучения среди тех, кто успешно прошел вступительное тестирование!
https://www.youtube.com/chann…/UCetgtvy93o3i3CvyGXKFU3g/live
На втором Дне открытых дверей состоялся розыгрыш бесплатных мест в новую Java группу!
Победителями стали: Даниил Дерут и Александр с e-mail
bagyev :)
Поздравляем ребят, ждем на занятиях, желаем успехов в обучении и новых карьерных высот!
Посадка на рейс "Серьезное изучение Java group #2" завершается.

Мы провели Два дня открытых дверей (видеозапись последнего можно посмотреть тут: https://www.youtube.com/watch?v=vQFxPyLt6lc), разыграли 4 бесплатных места в новой группе, рассказывали о "фишках" Java в постах #deepjava, активно знакомили пользователей с нашим продуктом и рассказывали, почему мы больше, чем просто обучающие курсы, отвечали на вопросы и делали много-много всего, чтобы наши новые студенты получили хорошие знания и возможности профессионального и карьерного роста.
И вот новая группа сформирована и начнет занятия уже завтра! Мы желаем ребятам успехов в обучении. Энтузиазма, жажды знаний и приятного чувства от утоления этой жажды. Желаем классных проектов, драйва и позитива.

Что дальше?
Сегодня еще есть шанс присоединиться к новой группе: http://otus.ru/lessons?course=1?utm_source=telegram и начать заниматься с завтрашнего дня.
Для тех, кто делает свои первые шаги в Java и не смог сдать вступительное тестирование, мы готовим обучающие материалы, которые помогут подготовиться к набору в новую группу по Java, который будет, скорее всего, осенью (т.к. летом мы планируем запуск курсов по другим специальностям). О готовности материалов мы обязательно сообщим.

Спасибо, что вы с нами!
У нас отличные новости и мы спешим поделиться ими с вами!
Мы знаем, что многие ждали открытие набора на курс серьезного изучения Python - ведь этот язык имеет такое широкое применение и его популярность постоянно растет, как и спрос на хороших разработчиков на Python - поэтому по итогам обучения лучших студентов ждут на собеседования наши компании-партнеры ;)

И вот сегодня мы с радостью объявляем: набор в группу серьезного изучения Python открыт! Ждем вас: знакомьтесь с программой, сдавайте вступительное тестирование, присоединяйтесь к группе: http://otus.ru/lessons?course=3?utm_source=telegram&utm_medium=internal&utm_campaign=post_python_new

Курс будет вести Станислав Ступников - программист рекламной системы в Mail.Ru с солидным опытом преподавания: более 5 лет - программирование на Python для студентов МГТУ им. Н.Э. Баумана; более 4 лет - курс СУБД в Технопарке Mail.Ru.

В общем, как обычно: будет не просто, но интересно; тепло, лампово и драйвово :)

И всязи с тем, что теперь в нашем канале мы будем публиковать информацию в т.ч. про Python (а не только про Java) - мы перееименовываем канал в OTUS Club Channel ✌️
Channel name was changed to «OTUS Club Channel»
Больше партнеров хороших и разных - больше карьерных возможностей!
Мы рады сообщить, что к числу наших партнеров присоединилась компания Tutu.ru.
+1 в копилку мотивации попасть в число лучших на курсе ;)
Вам нравились наши посты с хэштегом #deepjava? Очень надеемся, что да, потому что нам очень нравится делиться полезной информацией :)

В этом месяце (до начала обучения новой группы по Python) мы хотим погружать вас в тонкости мира Python. Поэтому совсем скоро мы начнем серию постов про #deeppython!

Любителей Java обижать не будем - посты про #deepjava мы все равно будем публиковать, правда, реже.

Знание - само по себе сила!
#deeppython
Сортировка массива - базовая операция. Каждый программист может написать несколько, а назвать - еще больше, алгоритмов сортировки. “Естественная” необходимость и любовь к красивым решениям дала нам MergeSort, QuickSort, HeapSort и т.д. Самоирония, видимо, породила такие алгоритмы как StupidSort, SleepSort и (мой любимый) TwitterSort. Что же использует Python? TimSort! Автором является широко известный в узких кругах Тим Питерс, а сам алгоритм был с портирован в Java и Android.
Это гибридный адаптивный алгоритм, который совмещает под капотом MergeSort, InsertionSort и хитрые эвристики. Алгоритм ищет в сортируемой последовательности длины N уже отсортированные подпоследовательности (run). Если такая подпоследовательность меньше определенного порогового значения (min_run) то идущие за ней дальше элементы досортировываются с помощью InsertionSort, пока критерий не будет удовлетворен. В итоге, исходная последовательность превращается в N/min_run отсортированных run’ов. run’ы сливаются последовательно и попарно, память выделяется только на элементы, которые действительно нужно перемещать. Допустим есть две подпоследовательности: A = [1, 2, 8, 9] и B = [4, 5,10, 21, 42]. В них 1, 2, 10, 21 и 42 уже находятся на своих финальных местах, что можно определить бинарным поиском B[0] в A и A[-1] в B. Память выделяется (и туда копируются) только на элементы из меньшей подпоследовательности, которые не стоят на своих финальных местах: 8 и 9. Дальше происходит слияние временной выделенного участка памяти и B с переносом элементов в A.
И, конечно, нельзя не упомянуть про режим галопа (galloping). В нем во время слияния элементы перемещаются не попарным сравнением, а сразу целой “пачкой”. Если сливаются temp = [8, 9] и B = [4, 5, 10, 21, 42] в A = [1, 2, _, _], то поиском temp[0] в B, можно определить, что элементы 4 и 5 нужно сразу перенести в A, после чего останется только дописать 8 и 9 в B. И это еще не все тонкости! Как выбирать min_run? Как искать элемент в массиве в режиме галопа? Для каких последовательностей сразу использовать InsertionSort без всей описанной “мишуры”?
Есть в чем покопаться! Приходите к нам на занятия: http://otus.ru/lessons?course=3?utm_source=telegram&utm_medium=internal&utm_campaign=post9.06
Набор в новую группу открыт. Будет много всего интересного!
Почемы мы считаем, что у курса Python действительно интересная и актуальная программа? Почему курс рассчитан на 5 месяцев обучения и почему мы отдаем предпочтение Python 2.7?
На эти и прочие вопросы мы ответили в статье:
https://habrahabr.ru/company/otus/blog/330606/
#deepjava #otus

Рано или поздно Java разработчик задает себе вопрос: Hibernate или MyBatis? MyBatis или Hibernate? От ответа зависит архитектура проекта, а ответ, в свою очередь, зависит от задачи. Давайте сегодня разберемся, что они такое и когда какой лучше.

Итак, Hibernate это ORM framework. Его полное название Hibernate ORM. Он полностью поддерживает JPA и, фактически, является имплементацией JPA. Его основная задача -- понять как размечены ваши классы аннотациями ORM, построить по ним схему и собирать объекты по строкам из базы. Hibernate сам пишет за вас запросы к базе. Для вас работа с базой выглядит как работа с объектами. Сохранить объект, загрузить объект, обновить объект. Как, собственно, и должно быть. Это же Object Relational Mapping.

MyBatis это Java persistence framework. Не ORM. MyBatis связывает методы интерфейса маппера с SQL запросом. MyBatis не умеет создавать схему. И, честно говоря, вообще ничего о схеме не знает. MyBatis превращает вызов метода в запрос к базе, и как результат вызова метода возвращает результат запроса.

Что лучше подходит для вашего проекта? Смотрите сами:
Если у вас много простых объектов без сложных связей друг с другом -- Hibernate.
Если у вас сложные запросы к базе на агрегацию данных -- MyBatis.
Если вы готовы поручить фреймворку создавать и обновлять для вас схему -- Hibernate.
Если у вас работа с хранимыми процедурами -- MyBatis.
Если вы не хотите писать запросы сами, и работать с JPQL -- HIbernate.
Если вы хотите писать свой ORM (а его так или иначе придется писать) -- MyBatis.

Можно попробовать использовать оба фреймворка в одном проекте. Но мы такого на практике не встречали. Поэтому рано или поздно Java разработчик встает перед вопросом: Hibernate или MyBatis?
#deeppython #otus

Все мы рано или поздно сталкиваемся с необходимостью сохранить какую-то информацию, да так чтобы намертво, чтобы внуки потом еще прочитать смогли. Ежели еще нужно делать хитрые выборки по сохраненному, то обычно мы приходим к использованию реляционных СУБД. Чаще все, если посмотреть рейтинги популярности, это MySQL. Что может быть проще? Качаем последний MySQL и запускаем.
И вот уже где-то в коде устанавливается соединение с БД, выполняется простой запрос:

import MySQLdb
….
cursor.execute("UPDATE User SET likes=likes+1 WHERE Id=%s", (user_id,))

Кажется, все хорошо. Даже если тут же сделать SELECT, то можно убедиться, что у пользователя увеличилось число like’ов. Но есть нюанс, если тот же SELECT сделать из консольного клиента, то пользователь как будто и не обновлялся. А если посмотреть SHOW PROCESSLIST, то видно, что запрос в состоянии “Waiting for table metadata lock”.
А все штука в настройках по умолчанию, о которых часто забывают. В частности, в MySQL последних версий по умолчанию движок таблицы InnoDB, транзакционный, все дела. А питонячьем MySQLdb с версии 1.2.0 опция autocommit выставлена в False. Что же получается? Получается, что все ваши запросы в таком случае выполняются в рамках одной транзакции и не видны другим транзакциям до явного вызова commit (или rollback). Плюс, лочатся метаданные используемой таблицы, что отображается в processlist’е.
Что делать? Можно явно вызывать conn.commit() в конце транзакции, а можно сразу после установления соединения выставить conn.autocommit(True), тогда каждый запрос будет завершаться коммитом прозрачно для вас. Ну и конечно, нужно внимательно читать документацию и changelog’и.

Решение показалось очевидным? Тогда, возможно, вы хорошо знаете Python. Проверьте свои знания на вступительном тестировании: http://otus.ru/lessons?course=3?utm_source=telegram&utm_medium=internal&utm_campaign=pythonpost14/06
У нас суперская новость! Нашим новым партнером стала компания Avito. Avito будут рады пригласить на собеседования наших лучших по итогам обучения студентов по курсам Python, мобильной разработки и QA (не мнее трех человек с каждого курса)