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

До нового года осталось меньше месяца, а я только нашёл эту прекрасную страницу: 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 #разработка

В больших и старых проектах на 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 дней была страшная ломка в сознании. Я для себя назвал этот процесс детоксификацией мозга: вся эта фейсбучная-новостная-политичесая-экономическая дрянь выводится из мозга. При этом сильно ломает. К счастью, по дороге телефон в руки не взять, а на стоянке уже нет сил... Потом происходит что-то вроде медитации. Постоянно думаешь, и успеваешь передумать почти все. Полностью от мыслей избавиться не удается, но даже самые навязчивые мысли рано или поздно уходят, так как им некуда деваться....

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

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

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