Блог Евгения Морозова

Закончил курс Rustlings на Stepik. Это мой первый пройденный до конца курс на Stepik (до этого начинал два других курса, но там начались зубодробительные задачи, плюс возникали какие-то авралы на работе, потому бросил на середине).

Поскольку это первый пройденный курс, думал, что в конце автоматом выдадут сертификат. Старался решить все задачи. Увы, этого не произошло, на странице моего профиля на Stepik нет ни единого упоминания о том, что я закончил данный курс.

Пара слов о курсе

Фактически, это сильно сокращенный и переупорядоченный набор глав из Rust Book. Книгу до этого прочёл целиком, но вопросов оставалось больше, чем ответов. Материал довольно сложный. Курс помог двукратно: 1. Перечитывая во второй раз смог гораздо лучше понять сложные концепции. 2. Упражнения заставили разобраться в сложных областях до конца (например, в макросах), т.к. при чтении книги кажется «В общих чертах понятно, потом, когда понадобится вернусь и доразбираюсь».

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

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

Еще один плюс за то, что после прохождения первого раздела мне прислали лицензию на образовательную версию любой IDE JetBrains. Ключом не воспользовался, т.к. у меня и так приобретены лицензии на несколько IDE, включая PyCharm и CLion, но за заботу спасибо.

Недостатки курса

  • Материал плохо упорядочен, разделы скачут. Например, материал про многопоточность на самом деле начался в разделе про стандартную библиотеку.
  • Несмотря на копирование Rust Book, целые главы пропущены, если не прочитать книгу заранее, то многие разделы окажутся абсолютно непонятными.
  • Задания в плагине Stepik для IDE IntelliJ (я использовал CLion, хотя, наверное, можно установить в любую IDE IntelliJ вместе с плагином для Rust) отформатированы плохо, масса проблем в разметке. По ощущениям, никто не вычитывал курс хотя бы однажды.

Но в целом доволен курсом, рад, что он попался мне на глаза. Несомненно, получил от прохождения большую пользу. До этого пытался решать задачи с LeetCode на Rust и терпел неудачи из-за слабого понимания многих концепций языка. Из-за этого поставил дальнейшее изучение языка на паузу. Сейчас чувствую уверенность, что смогу справиться с задачами на LeetCode, и, возможно, начать какой-нибудь хобби-проект на Rust.

#rust #stepik #курсы #mooc #степик

Прошла неделя после возвращения из отпуска, но не было времени написать. Эмоции улеглись и многое забылось. Часто жалею, что когда едешь на мотоцикле нет возможности записать приходящие в голову мысли. Порой они кажутся весьма оригинальными, в таком случае стараюсь удержать эти впечатления до конца поездки, чтобы записать в конце, но всегда забываю. Постоянно возникают новые виды, новые мысли, новые небольшие задачи в голове (заправиться, одеться потеплее, задуматься о ночлеге), которые вытесняют даже самые яркие впечатления.

Может быть, в такие моменты стоит останавливаться и записывать хотя бы подсказку в блокнот или диктофон, но всё время ведь спешишь непонятно куда. Обязательно надо доехать не долее, чем за два дня. Проезжать в день не менее 800 км. Как можно больше дней отпуска провести в месте назначения, а не в дороге.

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

В этот раз впервые заночевал в Каменске-Шахтинском, хотя ехал по M4 уже в четвертый раз. По ошибке заночевал не в байкерском отеле, а в гостинице СССР. Это часть одного комплекса, но, полагаю, отличаются интерьерами. Кроме меня байкеров не было, лишь уже поздним вечером приехали два гуся из Крыма, удалось перекинуться парой слов перед сном.

Номер в отеле

На первом этаже и в подвале отеля находится замечательный музей, посвященный СССР. Собраны редкие автомобили, мотоциклы, фотоаппараты, и прочая техника СССР. Гостиница, и музей очень понравились, не пожалел, что остановился. Только поленился сходить на другую сторону трассы, в парк Патриот, с интересной военной техникой. Думал, что остановлюсь на обратном пути, но, конечно же, не стал тратить время, так как надо было вернуться домой до начала рабочей недели.

Музей СССР

Начало октября в Сочи оказалось достаточно тёплым, даже жарким. Вода была тёплая, купание не вызывало ни малейшего дискомфорта. Температура воздуха порой значительно превышала комфортную. Людей на пляже было совсем немного, и количество уменьшалось с каждым днём. Лишь во второй половине октября пошли дожди, после которых резко похолодало. Уезжать не хотелось, а так как на работе перешли на удалёнку, остался ещё на недельку после отпуска.

В этот раз решил чуточку получше исследовать Сочи и окрестности. Из известных достопримечательностей побывал в санатории Орджоникидзе, на горе Ахун, в каньоне Белые скалы, проехался по красивейшему серпантину в Солохаул, и проехался по старой дороге в Красную поляну. Всё понравилось, все рекомендую. Подробно писать о каждом месте не буду, возможно, когда-нибудь позже.

Солохаул

Обратно доехал без приключений, и очень быстро. Переживал, что температура в Москве упадёт ниже нуля, но мне повезло — вернулся в последние тёплые выходные. Доехал очень быстро, хотя ехал не спеша, наверное, не быстрее 120-130 км/ч. Просто выезжал в 5.30-6.00 утра, когда дороги совсем пустые, и ехал не спеша, из-за чего меньше мёрз и уставал, реже останавливался. Повезло, что в первый день почти не было дождя, лишь где-то перед Воронежом началась лёгкая морось, недостаточно серьёзная, чтобы доставать дождевик. На следующий день повезло меньше, дождь пошёл в момент, когда начал привязывать вещи к мотоциклу, и не прекращался почти до самой Москвы. Хорошо, что перед поездкой купил новый дождевик и тёплые водонепроницаемые перчатки. Всё равно было холодно, но терпимо. Информационные табло на трассе показывали температуру от 12⁰C в Воронеже до 7⁰C почти до самой Москвы.

#путешествия #мото #сочи

Для поиска утечек памяти в приложениях на Python существует масса различных модулей, в том числе, уже встроенный в Python 3 модуль tracemalloc. Недостаток всех этих инструментов в том, что утечку надо воспроизвести в локальном окружении, а потом уже, используя pdb или ipdb, ковыряться в куче (heap), в поисках утекших объектов. Однако если у нас есть огромный проект, посещаемый миллионами пользователей, то воспроизвести утечку может оказаться невозможно, так как к ней приводит какое-то сочетание взаимодействия пользователей с проектом, которое не воспроизвести наугад.

К счастью, нашёл проект meliae, позволяющий сделать дамп кучи в произвольный момент, с тем, чтобы проанализировать ее в оффлайне, уже не на боевом сервере.

Однако, в проекте оказался досадный баг: целые числа Python он пытается сериализовать как тип C long. Но в Python целое число может быть произвольной разрядности, а в C long имеет разрядность 32 или 64 бит. Где-то в нашем проекте (или одной из его зависимостей) используются большие числа, поэтому создать дамп не удавалось, потому что этот процесс очень быстро обрывался с ошибкой OverflowError.

Делать нечего, все другие варианты поиска утечки я уже попробовал без малейшего успеха. Скомпилировал Python из исходников с отладочной информацией, скомпилировал meliae, и стал вспоминать полузабытые навыки программирования на C и использования отладчика gdb. Довольно быстро нашел место возникновения ошибки, проблема была только в том, что времени на поиски у меня немного, а изучение того, как сдампить из модуля на C полноценное представление целого числа Python, потребовало бы длительного изучения устройства интерпретатора Python.

В итоге воспользовался быстро найденной функцией PyLong_AsLongLongAndOverflow, которая возвращает -1, в случае, если число Python не помещается в long long. Сомневаюсь, что в нашем приложении утекают long, поэтому точное их значение меня не интересует.

Свои правки положил здесь: https://github.com/emorozov/meliae

Если удастся найти утечку памяти, постараюсь написать об этом тоже.

#python #разработка

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

Для облегчения поиска обработчиков нашел когда-то команду для Django, выводящую список всех обработчиков в проекте. Но она выводила только список обработчиков, без указания к какой модели они относятся. Чуть позже нашлась усовершенствованная версия, а затем я тоже приложил руки в процессе создания pull request для проекта django-extensions. Пришлось попотеть, так как django-extensions должен работать на большом количестве различных версий Python и Django (включая, например, PyPy). Но все препятствия удалось преодолеть, надеюсь, что мой код окажется в django-extensions, а пока оставляю ссылку на сам код команды, чтобы можно было пользоваться, пока рассматривается pull request: list_signals.py

#python #разработка

Установка MariaDB 10.4 на сервер Ubuntu 18.04 довольно нетривиальна. В частности, если не запретить профиль AppArmor, то сервер будет падать с различными ошибками, по которым совершенно невозможно понять, что дело именно в AppArmor.

Так что, записываю инструкцию себе на будущее, вдруг кому-нибудь еще пригодится.

Добавляем репозиторий

apt-get install software-properties-common
apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
sudo add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://mirror.biznetgio.com/mariadb/repo/10.4/ubuntu bionic main'

Устанавливаем

apt install mariadb-server

Выключаем профиль apparmor для mysqld, потому что он сломан

ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld

Запускаем

systemctl start mariadb

#mariadb #mysql #ubuntu #apparmor

Недавно обнаружил, что моему первому и пока единственному Open Source проекту — GtkBalls — исполнилось 20 лет.

Официальная страница

GtkBalls входит в состав многих дистрибутивов Linux и даже порты FreeBSD: – DebianUbuntuArchLinuxGentooSlackwareFreeBSDOpenBSD – и многие другие

В честь юбилея попросил Сергея обновить мой email на странице (до этого там был email, доступ к которому я потерял лет 15 назад, к сожалению), залил исходники на GitHub.

Также собираюсь портировать игру на Gtk 3, надеюсь, выкрою время до конца года.

#c #программирование #gtkballs #gtk

После долгого проживания в Азии понял, что люблю смену времен года. Как же приятно, что меняется температура, продолжительность дня, то как выглядит все вокруг. Даже запахи меняются. В начале осени начинает слегка пахнуть опавшей листвой, ближе к зиме воздух становится каким-то более свежим. Весной пахнет предвкушением лета. Насколько это разнообразит жизнь по сравнению с ежедневной одинаковой жарой. Когда живешь год на одном месте, и каждый день все вокруг остается одинаковым. Одинаковая жара, одинаковые деревья, одинаковые запахи.

Слишком часто бывает сложно понять, насколько что-то важно, пока этого не лишишься. Два года назад вряд ли бы даже задумался о том, что смена времен года может иметь для меня значение.

Закончилось путешествие Москва-Алтай-Байкал-Москва. Ровно 13,000 км, чуть больше одного месяца.

В Новосибирске Габриель сказал, что в таких путешествиях не столько узнаешь что-то о мире вокруг, сколько понимаешь много нового о себе.

У меня действительно произошел переворот в сознании. Наверное, его эффект пройдет, как проходит все под воздействием московской суеты, работы, и всего прочего. Но может быть хоть что-то останется...

Первые 4-5 дней была страшная ломка в сознании. Я для себя назвал этот процесс детоксификацией мозга: вся эта фейсбучная-новостная-политичесая-экономическая дрянь выводится из мозга. При этом сильно ломает. К счастью, по дороге телефон в руки не взять, а на стоянке уже нет сил... Потом происходит что-то вроде медитации. Постоянно думаешь, и успеваешь передумать почти все. Полностью от мыслей избавиться не удается, но даже самые навязчивые мысли рано или поздно уходят, так как им некуда деваться....

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

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

#алтай #байкал #путешествия

Закончился PyCon. Кратко опишу свои впечатления. Было интересно, на некоторых докладах чувстовал, что делаю велосипеды, тогда как многие другие — космические корабли.

Попытался участвовать в трех конкурсах: 1. Был смешной автоматик от Positive Technologies с вопросами по Python, некоторые весьма непростые. Выиграл мячик. 2. Была викторина в стиле «Что? Где? Когда?» от Яндекса, в которой играли командами. Наша команда заняла 8-е место из 12 (но мы были самой маленькой командой, поэтому нам пришлось вчетвером думать за десятерых). 3. Попытался поучаствовать в конкурсе от Positive Technologies, в котором надо было исправить несколько уязвимостей в Python приложениях.

На первый взгляд, конкурс от PT был простой, но первый час я бился с тем, что мои решения не проходили, подошел к Ивану Цыганову, он выяснил, что на сервере проверки решений закончилось место. Затем хотелось прослушать почти все доклады, так что урывками пытался в перерывах копаться в коде, но все уязвимости исправить так и не успел. Тем более, мне показалось, что две исправленные уязвимости проверяльщик упорно не хотел засчитать.

Но так как несколько человек этот этап прошли, то не уверен, проблема с моими исправлениями или проверяльщик все же ожидал какой-то шаблон, под который не подошло мое исправление. Иван обещал выложить исходники проверяльщика на GitHub, возможно, позже проверю.

Из понравившихся докладов запомнились больше всего: доклад Ивана Цыганова об уязвимостях, доклад Златы Обуховской о проблемах с асинхронностью в Python, доклад Александра Кошелева о сборке образов Docker без build зависимостей (не rocket science, но очень жизненно), доклад Артёма Малышева о DDD, доклад Бориса Цема об уменьшении сложности проектов Wargaming. И доклад Бобука до кучи, потому что он вызвал самое бурное обсуждение и массу шуток.

Все доклады прослушать не удалось. Часть докладов шла параллельно в двух разных залах, на части докладов пытался добить конкурс от PT, потому все пропустил мимо ушей.

Лично мои ощущения. После более, чем 10 лет работы в удаленном режиме, мне завидно смотреть на ребят, которые приезжают вместе, общаются, обсуждают происходящее. Я этого всего лишен, и начинаю понимать, как этого не хватает. Поскольку по одиночке никто не приехал, кроме меня, втесаться в чью-то компанию очень сложно, мне это не удалось, к сожалению. Люди приехали из одной компании, давно друг-друга знают, у них свои шуточки о своих рабочих проблемах, и так далее. Вклиниться в такой разговор очень непросто, моих социальных навыков для этого, увы, не хватило.

С другой стороны, скучать было некогда, пообщаться все же удалось, хотя не настолько плотно, как хотелось. Место было выбрано хорошее, в сосновом лесу. Организовано на уровне, любые организационные вопросы решались моментально, если вообще были.

По итогам начал думать, что во-первых, хочу в офис. Мне надоела жизнь перекати поля и надоел вакуум вокруг, минимум общения, в том числе, общения на профессиональные темы.

#pycon #python #работа

Хампи

Перед первой поездкой я оптимистично рассчитал время путём деления расстояния на среднюю скорость в 60 км/ч. Конечно, настоящее время поездки оказалось в два раза больше. Вообще, как показал опыт, в Индии почти невозможно проехать более 350-400 км в день даже на мотоцикле.

Приехал в Хампи уже после заката. Довольно быстро нашёл комнату в гестхаусе, повезло, ну и гестхаус был довольно дорогой. С трудом принял душ, так как вся ободранная кожа ужасно болела. По этой же причине было очень сложно спать.

Холмы Хампи

Утром вышел искать переправу на другой берег реки, так как именно там, по словам всех побывавших в Хампи, стоит жить (и я с ними совершенно согласен). Доехал до лодочной переправы у главного храма, спросил у лодочника, существует ли мост на другую сторону. Лодочник ответил, что нет. Тогда я спросил, может ли он переправить мой мотоцикл в лодке (эта Ямаха весит меньше меня, так что два взрослых человека легко могут занести ее в любую лодку). Опять отрицательный ответ.

Оставил мотоцикл и решил пешком переправиться на другой берег для разведки.

Сразу же после переправы на другом берегу находился прокат скутеров. Взял скутер, чтобы искать жилье и изучать окрестности. Запомнилось, что он сначала залил мне в него смесь бензина с маслом для двухтактных скутеров (в Индии они еще производятся и используются), затем ему пришлось переворачивать скутер, чтобы вылить ее, и залить чистый бензин.

Не успел отъехать от проката, меня останавливает баба. Если что, так в Индии зовут святого человека. Кстати, в той же поездке узнал, что на языке штата Карнатака, в котором находится Хампи, «ба» означает «подойди». Например, бабы в гестхаусе так подзывали котёнка: «ба-ба-ба».

Баба, кажется, хотел, чтобы я его куда-то подвез. Спросил меня, откуда я, и что делаю в Хампи. Ответил, что русский и ищу жилье в деревне. Баба сказал, что в Хампи очень много русских и он покажет мне дорогу до русского гестхауса. Сразу же сказал, что будет удобнее, если он сядет за руль, в общем, деловой оказался. Повез меня в гестхаус, который назывался «Пушкин», если не ошибаюсь. Меня это сильно удивило, не ожидал, что там будет так много русских, что найдутся даже русские гесты. Но мест в нём не было. Тогда мы поехали по другим гестхаусам. Мест не было нигде, так как в тот год был какой-то юбилей Хампи, и приехало очень много паломников. В итоге, баба завез меня на самый край деревни, последний дом самой последней улицы. В гестхаус, который стал моим самым любимым гестхаусом в Хампи. Его самого хозяин геста тут же отругал и прогнал. Позже, он пояснил, что это пьющий баба, и за это его никто не любит.

Сторговались с хозяином о цене, которая показалась высоковатой, но хозяин объяснил, что на время праздника все гестхаусы переполнены, и цены из-за этого тоже выше. Также сказал мне, что на эту сторону реки вполне возможно переправиться паромом, и объяснил примерно, как добраться до парома. Поэтому я почти сразу же отправился обратно в прокат, чтобы вернуть скутер и деньги за аренду (при аренде заплатил сразу за несколько дней вперед).

Переправился обратно в город Хампи, сел на мотоцикл и поехал искать паром. С первой же попытки нашел его, хотя ехал около 20 км без навигатора. В ту поездку мне все время везло. К парому вел крутой бетонированный склон, который заканчивался прямо в реке. Было страшно, что не удержу мотоцикл, и упаду с ним прямо в реку. Позже подъехал тяжелый Royal Enfield с двумя иностранными туристами и груженый кучей сумок. Позавидовал их отваге: удержать этого бегемота на спуске было явно непростой задачей.

Паром в Хампи

Минут через 15-20 подошел паром, который представлял из себя большую лодку, на которые мотоциклы заезжали по тонким и шатким досточкам. Для меня это было еще одним страшным моментом. Насколько я помню, мотоцикл французских туристов погрузили вручную, так как досточки его однозначно не выдержали бы.

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

Приехал в гестхаус, пошел в ресторанчик при гестхаусе. На тот момент, в гесте жил француз, ирландец, англичанин, и я. Спросил, что можно заказать на ужин, владелец геста сказал, что можно присоединиться к совместному ужину остальных жильцов. Сказал, что будет готовить пасту, нет ли у кого возражений. Никто не возражал, так что мы уселись за стол и стали ждать. Каждый рассказывал какие-то истории из жизни. Англичанин несколько лет прожил в Ауровилле, который был утопичной попыткой построить общество будущего. Поэтому слушать его было очень интересно. Француз тоже рассказывал много интересного. Каждый что-то рассказал. Чуть поодаль сидели баба, они не ужинали, йоги так поздно не ужинают, просто покуривали. Подозвали меня, поболтал с ними. Когда вернулся к столу, все соседи поцокали языками и сказали, что мне оказали большую честь, так как баба просто так не приглашают.

Эти вечера в гестхаусе были просто волшебными. Никогда ни до, ни после, не испытывал ничего подобного. Периодически, когда вспоминаю, кажется, что все это было сном. Но откуда же тогда фотографии?..

Остатки старого моста

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

#индия #хампи #мото #путешествия