2022


31.12.2022Итоги Года


Итоги прошлых лет: 202120202019

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

— vas3k. Итоги года 2022

Заброшен основной канал, заброшен блог, заброшен tgcalls, отсутствие новых статей где-нибудь на Habr... Год моего существования, а для кого-то настоящего выживания...

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

Проекты года

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

Новый проект

Python WebRTC

Моя радость! Моя сотня вложенных часов свободного времени! Несмотря на уникальность проекта для всего Python сообщества, принести в наш язык возможность взаимодействия с оригинальной WebRTC библиотекой, разработанной Google на C++, он не сыскал большого отклика. Или я просто зажрался и 100 звёзд на GitHub'e это для меня уже не показатель... В любом случае, штука рабочая и текущий результат ну уж очень красив, т. к. пытается соблюдать W3C спецификацию (API точь-в-точь, как у браузерного WebRTC) с поддержкой asyncio и возможность сделать синхронную версию. Там уже можно устанавливать подключение и передавать аудио данные! Задач море, посмотреть их все можно в проекте. Штука всё ещё перспективная, но для весьма узкого круга лиц.

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

Старые проекты

Yandex Music API

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

Генератор асинхронного клиента работает вот вообще не на AST, а на обычной замене строк. Сначала мне казалось, что я делаю как-то не так и есть решение более красивое. Но, во-первых, попытавшись объединить всё в одну кодовую базу столкнулся с большой и жирной проблемой – подсказки IDE. Весь код был желтым из-за type hints... Не возвращаешь корутину и делаешь await – лови warning! Поэтому, все замены при генерации – это async def вместо def, await req.send() вместо req.send() и так далее. Недавно гуляя по чужим проектам и, читая код, наткнулся на библиотеку python httpx. На моё удивление, у них идентичное моему решение! Только отличие в том, что они поддерживают руками два класса (sync и async), а я второй класс генерирую автоматически.

Не обошлось и без других генераторов от моей лени. Псевдонимы – переменные в camelCase в значение которых лежат функции в snake_case. Забыть такое прописать – раз плюнуть. Так и выходило, особенно с теми, кто вносил свой вклад в библиотеку. Как-то раз мне было уже неудобно просить ещё правки у пользователя и я решил написать генератор. Вот он уже анализирует AST и генерирует переменные. На этом я не остановился! Прямо сейчас в очень вялой разработке находится проект генерирующий OpenAPI спецификацию по моей библиотеке. Подробнейший Swagger со всеми моделями, описанием полей, методов, параметров! По данной спецификации запланировано сгенерировать Yandex Music API библиотеки для всех других языков с помощью уже имеющихся генераторов.

Интересные ссылки:

Telegram Crawler

В прошлых итогах года – это был проект за выходные дни, а на протяжении всего следующего года – это развилось в тотальную слежку, чуть ли не любого доступного пука в открытом доступе команды Telegram. Теперь эта вещь отслеживает изменения, декомпилируя Android клиент, распаковывая ресурсы iOS и macOS клиента. Для воплащении этого пришлось прикупить б/ушный айфон для джеилбрейка и первый раз окунуться в этот дивный мир по ту сторону.

Это ли всё? Нет! Уникальность проекта в использовании GitHub Actions и в целом GIT'a. В какой-то момент, таких приличных CPU bound задач workflow стали выполняться до жути медленно. Пришлось заниматься распараллеливанием. Через какое-то время ко мне постучался саппорт GitHub'a, показав их аналитику. Мой репозиторий уносил в небеса их графики крашей виртуальных машин. Чутка покумекав, я нашёл как не мелькать на дашбордах этих спецов своим проектом. Разошлись мирно, пожав друг другу руки.

Отслеживаются так же и серверные изменения. Telegram не против, канал растёт, сообщество от таких новостей цветёт. Редакторы крупных каналов подписаны на @tgcrawl и черпают оттуда сенсационные новости о грядущих обновлениях. Переделав структуру хранения собранной информации, я смог весьма просто навешать маркеры на определённые типы изменений. Сначала это использовалось для хэштегов, а когда в конце года в Telegram вышли форумы, то уведомления стали сыпаться в отдельную тему внутри @tfcrawl.

Код по-прежнему открыт, но чутка изуродовался в моих доработках. Тратить больше времени на эту поделку нерационально.

Yandex Music Bot

Telegram бот по-прежнему бесплатен, по-прежнему работает и радует пользователей, а в этом году стал работать ещё лучше и получил обновление!

Уж не стану перечислять все исправления ошибок, но их было много! Отчеты об ошибках собирались на протяжении двух лет в Sentry и я позакрывал самые частовозникающие и критические из них. Так, например, был найден самый приставучий баг с начала проекта – гонки. Когда бот вызывал совершенно не тот обработчик действия, который должен был.

А из обновлений всё просто: пиар моего подкаста (спасибо всем за лайки) и поддержка текущего проигрываемого трека из Last.fm, используя базу треков Яндекс.

Для любителей цифр могу сказать, что DAU ~1k, всего зарегистрировано больше 110к пользователей, в базе кэша треков лежит больше 1.2кк уникальных аудиозаписей, а в учётную запись Яндекс зашло больше 9к пользователей.

Не забываем, что для бота, ещё в далеком 2019, была сделана страничка для безопасной авторизации в аккаунт. Хоть она медленно, но уверенно погибает из-за устаревшего API, я освежил ей дизайн! Код, как гарантия честности, по-прежнему открыт.

Остальные

tgcalls. Рутина, нет желания продолжать за бесплатно. Всё что было сделано за этот год – это собраны колёса под Python 3.10 (дарова, 3.11 уже вышел) и добавлена совместимость с MTProto библиотекой, сломавшая обратную совместимость (но, благо, поднявшая мажорную версию).

AutopostBot. Проект, активно ведущий с десяток Telegram каналов с 2017 года. Занимается отзеркаливанием пабликов из ВК. Изредка нуждается в обновлении из-за изменений ВК/Telegram API. В этом году код был отрефакторен (на сколько это было возможно ничего не сломав), перенесен на sqlite и опубликован в публичное пространство.

CV. Да, моё CV тоже open source. На протяжении месяцев собирал все сливки рекомендаций с чатов и реддитов и применял их. Получилось применить не всё, но результатом доволен. Теку от Markdown и GitHub стилей для него. Умеет в генерацию как адаптивного сайта, так и PDF. Всё никак толком не испробую на практике, но те компании, что уже успели увидеть, отметили офигительность, только вот почему-то отшили... Пользуясь случаем, прошу присмотреться ко мне, как к потенциальному новому коллеге: https://marshal.dev/.

Telegram Zoom Bot. Нет слов – одни эмоции. Я уже писал, какой же ад проходить ревью приложения, чтоб попасть на их витрину. Они приходили ко мне с пентестингом, а потом докопались до версии TLS. Они приходили ко мне недавно с требованием заполнить документы по стэку технологий и как обеспечивается безопасность данных. Что хранится на сервере, а что нет. И в конце декабря они пришли ко мне требовать удаление украинского флага из названия бота! А ещё – полного ребрендинга, т. к. я использую слово "Zoom" и их логотип! НЕТ СИЛ! Бот стоит без обновлений, да и в целом, в них не нуждается, но как же они меня раздражают своими повторными ревью. Это ничего мне не приносит, а спроса с меня, как с компании. Тут я тоже могу поделиться цифрами. Всего под 130к пользователей, 13к из которых, привязали свой Zoom аккаунт. В день дай бог создаётся 100 конференций через бота. Обычно меньше...

Работа года

В итогах прошлого года я рассказал, что проработав больше года в VR компании, ни разу не был в VR'e... И вот, в прошлом году, мне заслали мой первый шлем, чтоб я посмотрел что это такое... А теперь, в конце 2022 года, я могу с уверенностью заявить, что перепробовал большинство современных шлемов всей VR индустрии, и в данный момент изучаю новейший Meta Quest Pro, а следующий год начнётся с нового шлема от Pico 🎉. Всё это мне нужно для ресёрча – зачастую, API, внутренних библиотек на шлемах и технологических возможностей девайсов в целом. Кроме этого, я теперь занимаюсь разработкой софта под шлемы и анализирую приложения других компаний.

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

Признаться честно – это big deal, который мне очень сильно понравился. Кайфанул от сотворения сие чуда, хоть и был человеком-оркестром. Мы сделали MDM (Mobile Device Management) в виртуальной реальности для Standalone (All-in-One) шлемов (шлемов, которым не нужен ПК, т. к. в них стоит свой процессор ОЗУ и есть ОС). Пожалуй, я просто перечислю стек технологий (часть из них я использовал в первый раз) для реализации всей экосистемы:

  • Electron для Windows и macOS приложения
  • React с очень перегруженной Material UI табличкой
  • Kotlin и Android API для написания фонового агента в системе
  • Конечно же, Django Channels, уже для серьёзных real-time общений, коих до этого на проекте никогда не было
  • Абсолютно все архитектурные решения, начиная от серверного взаимодействия и заканчивая каналом связи между приложениями на шлемах
  • И вся остальная серверная реализация для трёх приложений (фронт, VR приложение, программа на ПК, фоновый агент).

И ссылочкой поделиться мне тоже разрешили! Abelana VR | Device Management

Device Setup Tool

Приложение, которое занимается всей магией установки нашего лончера на шлемы. Действие сводится к одному клику, работает через ADB на macOS и Windows. Есть два вида представления девайсов: таблицей, карточками. Программа автоматически скачивает все необходимые обновления приложений при запуске, умеет себя самообновлять и выполняет всю подкапотную магию работы с ADB!

У меня была идея сделать этот Setup Tool в качестве сайта с помощью WebUSB, но то количество запросов прав и выбора устройства для подключения удручает. Да и подключать более, чем одно устройство за раз, там сущий ад! В любом случае, учитывая архитектуру приложения, его всегда в будущем можно будет перенести в чистый Web.

Frontend dashboard

Перегруз таблички сводит с ума! Куча диалоговых окон и всплывающих выпадающих списков просто отовсюду. Всевозможные tooltips с копированием данных по клику, выполнение удалённых команд и т.д. и т.п. Это всё главная панель управления всеми подключенными устройствами!

Фонового агента уж никак не показать, но он есть и выполняет всю магию со статусом и контролем девайса. Само VR приложение писал уже не я.

Вся эта система стоила мне дорогого – обновить Django до последней LTS для переезда на ASGI. Что сейчас мне очень сильно развязало руки и я занимаюсь автогенерацией Swagger'a из кода. Обожаю, когда он есть и всегда тащу в проект, если его нет. Опыт крайне положительный (сужу по другому проекту, где писал с нуля и сразу же внедрил автоген Swagger)! Клиентским разработчикам нравится, да и я сам зачастую использую вместо REST клиента локально. В следующем году хочу попробовать AsyncAPI для спецификации WebSocket'ов.

Достижение года

Я был приятно удивлён получить статус critical project на PyPI летом этого года. Данный статус значит, что мой tgcalls проект вошёл в TOP 1% по скачиванию во всём языке программирования Python! Если говорить не в процентах, то библиотека входит в TOP-3500 среди всех опубликованных пакетов! За что товарищи из PyPI наградили меня двумя бесплатными Google Titan Security Key для защиты своего аккаунта. Пост об этом в Telegram канале.

Переезд года

Heroku ➡️ VPS

Хотите верьте – хотите нет, но все эти годы мои Telegram боты были на бесплатном тарифе Heroku. Наш храбрый герой, спустя столько лет, пал... Бесплатного тарифа больше нет и пришлось медленно, но верно начинать оборачивать всё своё нажитое добро в контейнеры. Благо, база данных ботов уже давно была поднята на своём сервере и её переносить не пришлось. Оказалось совсем не больно! Ест ресурсов очень мало! Перебороло несколько страшных болячек Heroku. Одна из которых – это использование временных файлов, считаемое, походу, как использование оперативной памяти. Таким образом, мой ЯМ бот всегда убивали раз в сутки и делали жесткий рестарт, сбрасывая аптайм из-за превышения лимитов в 512мб. Переехав на свой сервер, данная проблема ушла, а контейнер потребляет ~150 мб ОЗУ, держа аптайм месяцами.

Yandex.Mail ➡️ iCloud Mail

Не одним Heroku сыты будем! Почта! Недавно Яндекс заявил, что его доменная почта весной станет платной. Казалось бы, какие-то там ~300 руб. в месяц, но...

  • Во-первых, мне сложно платить в рублях. Мои заграничные карточки не проходит. Мне и без этого хватает проблем с оплатой прокси сервера в МСК для ЯМ бота.
  • Во-вторых, ну, простите, но это СНГшный сервис. Перебравшись на всё заграничное, что-то покупать в Яндексе – как-то не катит.
  • В-третьих, я уже плачу за Apple One! Куда входит iCloud+, а в него и доменная почта!

Так вот, поговорим про их доменную почту. Я считаю, что она полностью готова для вашего переезда, но есть парочку НО.

Вы не можете сделать больше трех псевдонимов на 1 домен. А в распоряжении у вас 5 доменов. Это значит, что вы не сможете завести больше трех ящиков (15 для всех доменов) для отправки писем. Выделил слово специально, так как с iOS 16 появилась функция catch-all! Вы получите письмо, отправленное на любой набор символов, расположенном на вашем домене, но ответить сможете только с трёх. Как по мне, то это более чем достаточно.

Нюанс следующий... Вы не сможете иметь несколько связок логин+пароль для входа в почту. Вы входите в iCloud под своими кредами (app specific password). И уже на один этот аккаунт к вам ссыпается вся ваша доменная почта. Мне было сначала как-то необычно, а потом ощутил всё удобство, подключив в Spark только одну учетную запись!

Чтоб рассказать про почтовый клиент, стоит упомянуть мою миграцию почты. В общей сложности я перенес больше 20к писем со всех своих почт, начиная с ~2013 года. Вышло это, кажется, больше чем на 1гб в iCloud Storage. Делал это с помощью imapsync. Если не знаете что это – попробуйте срочно! С помощью этой штуки вы можете делать бэкап своей почты когда угодно и куда угодно. Мигрировать между почтами, не теряя историю и чистить старые почты, с которых вы ушли в одну консольную команду! Оно переносит абсолютно все флаги, которые где-то используются как пины, где-то как избранное. Очередная особенность – при копировании у письма будет две даты. Одна – оригинальная, когда письмо было получено, а вторая – от протокола, когда письмо было первый раз увидено. У дубликата эта дата будет датой импорта.

А теперь про клиент! Я думал уж переехать на клиент Apple Mail, который есть и на iOS, и на macOS, но... К сожалению, клиент на iOS сортирует письма как раз по дате импорта! Такого поведения не было замечено мной на клиенте для macOS. Соответственно, я вернулся на родной Spark, которым пользуюсь уже больше 5 лет. Smart 1.0 прекрасен.

Покупки года

В прошлом году я скупил весь Apple Store, в этом году я пошёл дальше и начал его скупать для родни. Кроме этого, купил себе развлекуху – Steam Deck (предзаказ которого сделал ещё позапрошлым летом). А вместе к деку и microSD на 1TB... А вместе к microSD и игр на сотни баксов, которые пропустил за последние лет 10... И не играю, вот вам мой Steam Replay 2022, но библиотека красивая, Steam Deck, особенно в кейсе Killswitch от dbrand, просто соска!

Новый год – новое рабочее место. От прошлогодней клавиатуры, трекпада и прочей лабуды я отказался и купил себе стол да кресло.

Появились новые категории трат: путешествия, здоровье. А ещё, с августа месяца я веду учёт прихода и расхода, записывая с какого счёта, на что, сколько и когда. Классифицирую и залипаю на графики. Использую для этого приложение Money Manager. Но давайте вернёмся к категориям трат!

Здоровье

Ещё год назад я ставил рекорды по количеству дней, не выходивших на улицу. А сейчас я ставлю рекорды по стрику дней, выходя на улицу закрывая все кольца на моих Apple Watch! На сегодняшний день у меня больше 70 дней закрытия целей по ккал и времени тренировки. Я начал худеть и за последние месяца полтора уже сбросил 7кг. Меньше ем и больше двигаюсь. А вот список моих активностей:

  • Прогулка в среднем 4км, но больше смотрю на время и постепенно его увеличиваю. Сейчас это уже минут 45.
  • Скакалка. Ещё одно сообщество, на которое я поглядываю и пытаюсь стать его частью. 10 минут мне хватает вдоволь. Использую специальное приложение на часы, которое ML'ом по датчикам считает прыжки (называется Jump Rope Fit).
  • Игра в настольный теннис (спасибо за это виртуальной реальности). Очень реалистично и для меня достаточно. Разработчики сильно поработали над физикой. Игра Eleven Table Tennis.
  • Игра в Beat Saber тоже в VR. Уровни с приседаниями и уклонами дают жару.
  • На крайний случай плохого настроения и погоды – хожу по квартире.

А теперь о, возможно, необычном для вас. Можно сказать гиканулся, можно сказать стал биохакером, но вот как вышло и когда-то дойдёт до всех. Я отслеживаю каждый возможный параметр, предоставляемый Apple в приложении "Здоровье" (и это то, что популяризирует Apple последние 8 лет, поверьте мне, я прочитал их PDF'ку на страниц 60 о краткой истории развития направления здоровья). Начал скупать всевозможные устройства, которые могут добавить хотя бы один заполненный параметр.

Мои гаджеты которые синхронизируются с Apple Health:

  • Зубная щетка
  • Тонометр
  • Градусник
  • Умный ремешок для Apple Watch с BIA
  • Напольные весы (на самом деле вбиваю ручками через Apple Shortcuts)

Моя утренняя рутина измерений (некоторые пункты не каждый день):

  • Вес
  • Объём талии
  • Давление
  • Температура (1-3 секунды занимает измерение)
  • ЭКГ, используя только одно отведение от запястья (Apple Watch)
  • Lean body mass, body fat, etc (умный ремешок AURA)

Кроме утренней рутины, например, я веду учёт выпитой жидкости, сна, выпитого алкоголя и кучу чего ещё!

Про сбор данных о теле, самых классных приложениях для здоровья и всём остальном я уже "бегло" рассказал в видео на минут 20 в своём Telegram Live канале: тык, но в идеале, конечно, написать подробнейшую статью.

Ко всему прочему, я конечно же решил провести чутка обследований своего организма. Потому что весить под сотку килограмм, набрав это всё добро всего за 2 года, может быть звоночком, а может и не быть. Так что к утренней рутине добавились ещё и дедовские таблетки (в основном витамины), с которыми я тоже успел поиграться в этом году.

Путешествия

Я собрал свой carry-on bag и заполнил его кучей диджитал снаряжения, которое использую не только в путешествии, но и в регулярной жизни! Обошлось мне всё это в копеечку, но я уже проверил весь этот набор в Литве, посетив три города, кучу музеев и тюрьму 🔫. Кроме этого, летом я побывал в трёх новых для себя морских городах Польши! Все фотографии и видео можно посмотреть у меня в избранном в инсте @ilya.marshal.

А вот, собственно, и сам рюкзак и как я его складываю. Там есть всё что мне нужно для жизни! Сам я стал членом клуба Pack Hacker – удивительное сообщество путешественников с одним рюкзаком/сумкой/чемоданом, налетавшие кучу километров. Обзор содержимого заслуживает отдельную статью, хотя я не сильно отходил от предложенных вариантов в сообществе.

В заключении

Почти у финиша! Есть те вещи, которые я не включал или не смог вынести в отдельный раздел, а есть просто то, о чём не вспомнил. Статья писалась на одном дыхании в последний день, есть немалая вероятность, что я разучился это делать, не писав ничего подобного больше года, но имеем, что имеем. А вот остатки, которыми хотелось бы поделиться, хотя бы для себя, из будущего:

  • Произошло обновление личного бренда! Такого чуда не было с 2017 года. Теперь у меня новые аватарки, фоны, обложки и цвета! Оранжевый больше не провоцирует вытекание глаз (I hope). Я за час постарался реанимировать сайт, куда могу опубликовать итоги года, изменив цветовую палитру темы. Стало, конечно, лучше, но на хороший редизайн не тянет.
  • Я наконец-то довёл идею о подкасте до реализации! Тут вы можете найти Marshal's podcast на всех платформах!
  • Прозанимался с репетитором английского языка 2 месяца, наговорив больше, чем на 40 часов. Стал куда увереннее, но сам опыт мне не понравился, скорее всего из-за самого преподавателя, о чём я рассказал в одном из своих выпусков подкаста.
  • Принял участие в первом в жизни хакатоне и стал его победителем! Дело было в Google Campus for Startups в Варшаве. Удивительно хороший опыт для первого раза. Команда нашлась на месте и собралась просто невероятно хорошо!

Тут должна была быть копипаста с прошлых итогов, как уже традиция ("Сделайте свой следующий год ЛУЧШЕ, ЧЕМ ЭТОТ!!! ✨"), но, в этот раз будьте просто целы и невридимы. Здоровья вам и вашим близким – как физического, так и ментального. С наступающим!

Быть может, я вам понравился 👉👈 – не стесняйтесь писать! HR, девушки, парни, бородатые мужики, желающие встретиться где-то в шенгене. Вот ещё раз CV: https://marshal.dev/ и инста @ilya.marshal.

Итоги прошлых лет: 202120202019

Недавние посты


© marshal.by 2022

Исходный код

Сайт работает на Gatsby + prismic и опубликован на GitHub.