ru
Feedback
OTUS: программирование и карьера в IT

OTUS: программирование и карьера в IT

Открыть в Telegram

Канал для быстрого карьерного роста в IT: опыт практиков, актуальные технологии и инструменты, чтобы быть впереди коллег и привлечь внимание руководителей. Иногда шутим! 🔔Включайте уведомления, чтобы не пропустить!

Больше
7 345
Подписчики
-224 часа
+47 дней
+1230 день
Архив постов
#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

#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?

Почемы мы считаем, что у курса Python действительно интересная и актуальная программа? Почему курс рассчитан на 5 месяцев обучения и почему мы отдаем предпочтение Python 2.7? На эти и прочие вопросы мы ответили в статье: https://habrahabr.ru/company/otus/blog/330606/

#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 Набор в новую группу открыт. Будет много всего интересного!

Вам нравились наши посты с хэштегом #deepjava? Очень надеемся, что да, потому что нам очень нравится делиться полезной информацией :) В этом месяце (до начала обучения новой группы по Python) мы хотим погружать вас в тонкости мира Python. Поэтому совсем скоро мы начнем серию постов про #deeppython! Любителей Java обижать не будем - посты про #deepjava мы все равно будем публиковать, правда, реже. Знание - само по себе сила!

Больше партнеров хороших и разных - больше карьерных возможностей! Мы рады сообщить, что к числу наших партнеров присоединилась компания Tutu.ru. +1 в копилку мотивации попасть в число лучших на курсе ;)

У нас отличные новости и мы спешим поделиться ими с вами! Мы знаем, что многие ждали открытие набора на курс серьезного изучения 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 ✌️

Посадка на рейс "Серьезное изучение Java group #2" завершается. Мы провели Два дня открытых дверей (видеозапись последнего можно посмотреть тут: https://www.youtube.com/watch?v=vQFxPyLt6lc), разыграли 4 бесплатных места в новой группе, рассказывали о "фишках" Java в постах #deepjava, активно знакомили пользователей с нашим продуктом и рассказывали, почему мы больше, чем просто обучающие курсы, отвечали на вопросы и делали много-много всего, чтобы наши новые студенты получили хорошие знания и возможности профессионального и карьерного роста. И вот новая группа сформирована и начнет занятия уже завтра! Мы желаем ребятам успехов в обучении. Энтузиазма, жажды знаний и приятного чувства от утоления этой жажды. Желаем классных проектов, драйва и позитива. Что дальше? Сегодня еще есть шанс присоединиться к новой группе: http://otus.ru/lessons?course=1?utm_source=telegram и начать заниматься с завтрашнего дня. Для тех, кто делает свои первые шаги в Java и не смог сдать вступительное тестирование, мы готовим обучающие материалы, которые помогут подготовиться к набору в новую группу по Java, который будет, скорее всего, осенью (т.к. летом мы планируем запуск курсов по другим специальностям). О готовности материалов мы обязательно сообщим. Спасибо, что вы с нами!

На втором Дне открытых дверей состоялся розыгрыш бесплатных мест в новую Java группу! Победителями стали: Даниил Дерут и Александр с e-mail bagyev :) Поздравляем ребят, ждем на занятиях, желаем успехов в обучении и новых карьерных высот!

Кажется, ссылка была не очень... вот точно верная! https://www.youtube.com/channel/UCetgtvy93o3i3CvyGXKFU3g/live

Через считанные минуты начинаем трансляцию второго (и последнего) Дня открытых дверей! Присоединяйтесь, задавайте вопросы, следите за розыгрышем бесплатного обучения среди тех, кто успешно прошел вступительное тестирование! https://www.youtube.com/chann…/UCetgtvy93o3i3CvyGXKFU3g/live

Завтра мы проведем еще один День открытых дверей по Java (последний перед началом обучения новой группы). Регистрируйтесь на http://otus.ru/dod?utm_source=telegram&utm_medium=internal&utm_campaign=dod2 и готовьте свои вопросы. А поскольку мы по традиции разыграем бесплатное обучение - торопитесь скорее пройти вступительное тестирование, чтобы принять участие в розыгрыше!

И еще один весомый аргумент в пользу изучения Java! https://habrahabr.ru/company/otus/blog/329816/

Что такое “углубленные основы”? В нашей программе есть такая тема. Что такое основы Java думаем, понятно. Например, цикл for или ветвление if-else или создание объекта через оператор new. Как основы могут быть “углубленными”? Рассмотрим следующий базовый вопрос: как создать объект в Java? Первый и самый правильный ответ: через оператор new. Что может быть более базовым в объектно ориентированном языке, чем Object object = new Object(); Теперь усложним вопрос: Как создать объект в Java без использования new? И на этот вопрос есть два ответа: Reflection и клонирование. Можно создать объект, если у вас есть объект класса Class<Т> этого класса: Object instance = Class.forName("java.lang.Object").newInstance(); То есть вы можете получить новый объект класса зная только название этого класса (конечно если объект типа Class для этого класса может быть загружен класс-лоадером). Можно сделать класс Clonable и вызвать protected native Object clone() класса Object. В результате вы получите копию объекта, которую для вас сделает нативный метод. Хорошо. Еще немного усложним задачу: как создать объект в Java не вызывая его конструктор? Кто сказал, что нельзя так сделать? Так работает ObjectOutputStream, когда десериализует объект. Вызывает sun.reflect.ReflectionFactory.newConstructorForSerialization() Фактически создавая объект произвольного класса через вызов конструктора java.lang.Object Что еще можно углубленно-базового рассмотреть? Вот, например, области видимости переменных: public, protected, private. Интересно что о них можно углубленного рассказать? Посмотрите sun.reflect.MagicAccessorImpl. Да-да magic accessor.

Начинаем понедельник с отличных новостей! Наших лучших выпускников по курсам Java, C++, JavaScript на собеседование ждет еще одна компания - 1С. Еще больше карьерных возможностей!

На первом Дне открытых дверей состоялся розыгрыш бесплатных мест в новую Java группу! Победителями стали: Егор Кузьмин и Сергей Жерновой. Поздравляем ребят, ждем на занятиях, желаем успехов в обучении и новых карьерных высот!

Мы начинаем День открытых дверей! Присоединяйтесь! https://www.bigmarker.com/otus-ru/11

Напоминаем, что первый День открытых дверей пройдет уже завтра! Мы не только поговорим о проекте OTUS, программе обучения и перспективах для выпускников, но и по традиции разыграем среди успешно прошедших вступительное тестирование несколько бесплатных мест в новой Java группе. Если вы еще не зарегистрировались и не прошли вступительное тестирование - самое время сделать это! http://otus.ru/dod

3 июня у нас стартует второй курс по программе “Java разработчик”, в преддверии этого события мы приготовили обзор программы обучения - чем мы руководствовались и почему считаем ее актуальной? Все что вы хотели знать, но боялись спросить о Java! :) 👇 https://habrahabr.ru/company/otus/blog/329458/

Наших компаний-партнеров стало еще больше! Теперь и Лаборатория Касперского ждет на собеседования наших лучших студентов. Компания заинтересована в выпускниках курсов Python, C++, мобильной разработки и информационной безопасности. Запись на эти курсы откроется совсем скоро!