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

В начале 00-х познакомился на тусовке фотографов с одним человеком. Тогда он работал в очень далекой от IT области, увлекался только фотографией (почти как я, разве что я работал в IT). Мы не подружились, хотя какое-то время часто общались о чем-то на форумах, несколько раз пересекались на встречах фотографов-любителей.

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

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

Необычное совпадение. Умеет жизнь удивлять.

#жизнь

Первый опыт написания чего-то нужного лично мне на Rust: annotate-branches или просто anb. Утилита, выводящая список веток Git в текущем каталоге, вместе с кратким описанием и статусом задачи из Jira (предполагается, что ветки имеют такие же названия, как и задачи в Jira).

Можно было намного быстрее и короче написать этот скрипт на shell, но каждый изучающий Rust просто обязан переписать что-то тривиальное (или не очень) на Rust. Кроме того, это хорошее упражнение для новичка в языке, т.к. требуется задействовать подпроцессы, регулярные выражения, и взаимодействие с сервисами по сети. Неожиданно легко получилось написать, ожидал, что будет дольше и труднее.

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

#rust

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

Удаление профиля в Facebook хорошо описанно в их же собственной справке. Первым делом необходимо создать файл с дампом всей вашей информации в FB (если не хочется терять загруженные фотографии и сообщения). В моём случае он создавался менее 10 минут и имел размер около 600 Мб. Это обычный архив, в котором находятся все мои сообщения в HTML формате, а также все фотографии, которые я загружал в Facebook. Ожидал, что размер будет больше, но видимо, это связано с тем, что долгое время уменьшал размер фотографий вручную перед загрузкой в FB. Поэтому многие сохраненные фотографии имеют низкое разрешение и маленький размер.

Затем вводится пароль для подтверждения удаления профиля. В течение месяца можно передумать и отменить удаление. Говорится, что после этого профиль и все данные удаляются навсегда (так я и поверил). Но в этот раз вряд ли передумаю. Опыт временного удаления профиля на два месяца показал, что без социальных сетей жить не только возможно, но даже и лучше, чем с ними.

#жизнь

Certificate

Ссылка на курс на Udemy

Курс довольно простой и короткий, вопросы к курсу тоже очень простые, но курс всё равно понравился. Для новичка довольно объясняется много важных вещей, при этом очень понятным языком, и на примерах, отличающихся от Rust Book (которые используют множество других курсов), что позволяет взглянуть на язык с немного другого ракурса.

#rust #курсы #udemy #mooc

Прошёл курс по структурам данных на Stepik. Получил сертификат с отличием.

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

#stepik #mooc #курсы #алгоритмы

До нового года осталось меньше месяца, а я только нашёл эту прекрасную страницу: Learning Rust in 2020.

Я стал осторожно изучать Rust с начала 2020. Особых причин для изучения не было. Хотелось изучить какой-то новый язык программирования, чего уже давно не делал, так как не было времени и сильной необходимости. При этом не люблю языки, работающие на виртуальных машинах (видимо, сказывается нелюбовь, вызванная столкновениями с ранними версиями Java, которые всегда больше обещали, чем делали). Есть исключение: мне нравится Clojure и я делал к нему несколько подходов, но очень глубоко не погрузился. Мне не хочется изучать еще один интерпретируемый язык. Я трушу идти в экзотические и/или пуристские языки (Haskell, Scala).

Rust показался идеальной целью по многим параметрам. Он производительный и мощный — в том смысле, что может работать на голом железе, без интерпретаторов, байт кода, сборки мусора, и так далее. При этом, он высокоуровневый, но без сборки мусора, которая заменена на мощную и сложную систему управления памятью, иногда называемой «сборкой мусора во время компиляции».

После прочтения Rust Book, прежде чем перейти к написанию какого-нибудь хобби-проекта на Rust, хотелось для начала набить руку на простых примерах на сайтах типа LeetCode или CodeWars. Однако первые же попытки решить простейшие задачи на LeetCode стали вызывать серьезные трудности. Я знал, что на Rust сложно реализовывать структуры данных из-за стремления компилятора сделать программы максимально безопасными. Но не предполагал насколько, и насколько сложно решать эти проблемы имея за поясом только Rust Book, которая, всё-таки, не объясняет множество критически важных вещей.

Страница Learning Rust in 2020 немного подняла самооценку, так как на ней поясняется, что, к сожалению, задачи на LeetCode и CodeWars плохо сформулированы на неидиоматичном Rust. Предлагается несколько альтернатив, например, Exercism — сайт, на котором можно решать задачи, составленные профессионалами на идиоматичном Rust. Более того, обещается, что проверять и подсказывать будут настоящие наставники. Зарегистрировался и решил первую тривиальную задачу. Постараюсь информировать о ходе прохождения курса, концепция мне очень нравится. Но прежде надо будет закончить другой начатый курс: Learn Rust by Building Real Applications , который пока нравится тем, что доступно и просто объясняет как некоторые сложные концепции, которые не до конца объяснены в Rust Book, так и многие вещи, которые даже не были затронуты в Rust Book.

#rust #курсы #ссылки

Изучая Rust, не могу не отметить, что находить информацию в современном мире становится всё труднее. Не последнюю роль играет отмирание традиционных средств распространения информации, таких как персональный сайт, персональная страница, блог, и замена их на гораздо менее привлекательные и доступные страницы в facebook и блоги в телеграм. Кстати, блоги на GitHub тоже не люблю: по каким-то непонятным причинам более половины недоступны. То есть видишь где-то ссылку на блог на GitHub, переходишь, а там — 404. Сталкиваюсь с этим настолько часто, что нередко даже не пытаюсь открывать, если увидел домен github.io.

Ну а facebook и телеграм — это просто закрытые от индексирования эфемерные песочницы. Любая информация, попавшая туда, навсегда исчезает за горизонтом событий. Не говоря уж о том, что facebook давно стал инструментом политической пропаганды и жесточайшей цензуры.

Поэтому находя случайно интересный блог, радуюсь как ребёнок. Сегодня поделюсь следующей находкой: Faster than lime.

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

#rust #ссылки

Закончил курс 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 #разработка