← на главную

Лайвлупинг, медиапродакшн и все эти ваши компьютеры

Алексей Батищев. Заметки обо всём, что происходит со мной и окружающим миром

Важные теги: Мои видео и другие работы, Забрать своё из облаков, Кровавый Энтерпрайз на коленке

Алеша и программирование — 2

Продолжаю ностальгировать по языкам программирования

Java

Яву на учёбе нам показал (и научил) крутейший препод по предмету «Языки программирования высокого уровня» — собственно, тогда она только набирала ход и ещё ходила под ярлыком «новый язык, который недавно переименовали из OAK в JAVA». В целом на тот момент она показалась довольно синтетическим и плохо применимым на практике конструктом, неким «идеальным языком для прекрасного будущего». Сейчас это будущее наступило, но в моих задачах с явой я не сталкиваюсь совершено, хотя в компьютерно-мобильном окружающем быту на ней написано примерно половина всего.

По учебе на яве были писаны курсовые и лабораторки, а главная шутка и байка тут — про курсовую, которую я написал для однокашника С. , и которую тот, ни разу не появившийся на лекциях и семинарах, пошел сдавать. Он был невероятно талантлив в вопросах сдачи неизученного, и поэтому перед зачетом подробно расспросил у меня весь алгоритм программы. Конечно, преподу С. на все вопросы по тексту программы ответил, тут мол создаем массив, а здесь мол идем по циклу. Поняв, что этим его не пронять, препод задал вопрос-фаталити: «а как эту программу запустить?» С., ни разу не запускавший самостоятельно ничего со школы, ответил привычно — «Контрол Эф Пять», и был немедленно со сдачи выгнан.

Javascript

На жаваскрипте что-то писалось на учёбе, что-то потом в пору веб-строительства, да и до сих пор регулярно в исходниках сайтов копошусь, благо с начала 2000-х этот язык стал основой веба, и теперь с помощью актуальных фреймворков на нём шарашат примерно всё. Хотя тогда, например, друг Лёха делал на нём курсач для подсчёта простых чисел (и оно в этом вашем интернет эксплорере даже что-то считало).

Из смешного тут — лабораторка для взлома простого шифра перестановкой, на написание и отладку которой было потрачено две ночи, а потом оказалось что то же задание дотошный одногруппник решил за одну ночь, просто систематически и аккуратно перекладывая бумажки с шифром на столе. Да, моя программа после написания могла мгновенно (почти) решить лабу с любыми данными, но первый в группе результат получил всё-таки он.

PHP

PHP стал для меня в начале 2000-х окном в мир веб-разработки, в итоге на нём за много лет было запилено около двух десятков сайтов. Применялись и Joomla, и Drupal, и MODx, и конечно в какой-то момент был сделан собственный движок — потому что каждый программист PHP обязан за свою жизнь написать хотя бы одну CMS.

Среди работ были и несколько версий сайта семейного центра, сайт элитного часового бренда с крутейшей системой генерации картинки на лету в разделе «примерка», сайт нашего DIY-музыкального комьюнити U-CLUB (о да, у нас самодельный клуб и продакшен с образовательным и развлекательным контентом для ютуба ещё до того как это стало мейнстримом), сайт одного гитариста-виртуоза и его школы, визитки предприятий и интернет-магазины, и куча всего ещё. Большинство сайтов уже модернизированы или мертвы (ах, как меня расстраивает эта изменчивость веба), но кое-что работает до сих пор, как ни удивительно.

Lua

В середине 2000-х популярной была Direct Connect — p2p технология обмена файлами в локальной сети. Сервер для этой сети можно было запустить на виндовой программе PtokaX, которая поддерживала ботов на Lua. Документации по API хаба для бота не было совершенно, зато был чужой готовый бот, изучая и модифицируя исходный код которого, я написал в итоге свой (и попутно изучил Lua). Это был увлекательное приключение длиной почти в год, на выходе был уникальный по тем временам комбайн, следивший за чатом (анти-флуд, анти-мат и антиспам), добавляющий сервисные сообщения и прочие улучшайзеры для пользователей (моя любимая тема — роботы работают на пользу человеку). Также бот умел, благодаря придуманным ноу-хау, следить за обьёмами раздаваемого пользователями, чтобы добавить в изначально анархический и бесконтрольный мир DC++ немного управляемой справедливости, и дополнительно этим развивал сеть. В итоге бот ушел в народ, и ещё несколько лет назад на указанную в тексте почту приходили вопросы от админов по его работе и модернизации.

VBS

VBS — самый лёгкий в освоении и популярный на тот момент инструмент автоматизации рутинных действий офисных работников и сисадминов. Чего тут только не было, от автозаполняшек документов Microsoft Office, до инфраструктурных штук. На VBS я впервые начал пилить средства автоматизации, реально в промышленном масштабе экономящие силы людей (и деньги предприятий) — скрипты облегчали и автоматизировали работу техподдержки и отдела системного администрирования, собирали и систематизировали данные, генерили без устали красивые отчёты, выполняли рутину, сводя работу человека к мониторингу и редким управляющим воздействиям.

Любимая история тут — в стиле цитаты Доктора Хауса «Все врут»: один из процессов подразумевал, что у клиента появится нужный функционал после перезагрузки рабочей станции. Перезагружаться никто не любит, поэтому сотрудники часто звонили в техподдержку, жаловались что «ничего не работает, хотя я перезагрузился», и только после долгих разбирательств и препирательств выяснялось, что ребута не было. Тогда на предприятии уже был распространён мой скрипт, показывающий по клику на ярлыке спасательного круга на рабочем столе информацию о компьютере — обычно диспетчер просил запустить его, чтобы узнать адрес и имя машины. В этот скрипт был добавлен вывод информации о времени последней перезагрузки машины — и в итоге время работы по таким заявкам сократилось феноменально. Диспетчерам больше не нужно было спорить или убеждать клиентов, так как бездушная машина палила клиента на лжи о перезагрузке самостоятельно.

В итоге фокус с VBS в работе перешел на powershell как только тот стал достаточно распространённым на машинах клиентов на предприятии — а вместе с ним и в быту он стал для меня основным.

Powershell

Об этом божественном языке на заре его развития мне рассказал мудрый старец Юсуф, коллега по отделу, заставший в своей карьере еще поздние БЭСМ и прочие советские мейнфреймы, но до самого ухода на пенсию сохранявший остроту айтишного ума. Переходить на новый язык, имея зоопарк старых решений на VBS, было непросто — но я взял новую большую задачу, накинулся на неё с нулевым знанием PS, и изучение пошло в гору. Скоро будет 10 лет как я впервые что-то на нём написал, за это время он стал привычным инструментом, хотя год от года изучается и находится что-то новое (а прошлогодний код начинает выглядеть немножк так себе).

С углублением в область практической кибербезопасности для PS нашлось много новых применений — кроме привычной автоматизации рутины, на нём пишутся различные тулы для исследования инфраструктуры, управления угрозами и интеграции между системами, и фактически на нём написано 90% ядра системы управления уязвимостями, которая сейчас работает на предприятии. Ну а дома, в быту, на павершелле пишутся скрипты, переименовывающие файлы сьемок концертов c GoPro и фотиков, медиа-кодировщики, забираторы своего из облаков и бэкаперы, и куча всего другого полезного.

Python

Со временем оказалось, что все языки (особенно с моим уровнем потребностей в них) примерно одинаковы, и влезать в любой можно относительно легко. Вот и c python так вышло — некоторое время назад нужно было по работе применить тулу vulristics, кое-чего в её функционале не хватало — ну, сел, разобрался с синтакисисом, и дописал.

Подробно сам python я разобрал во время марафона Яндекса в этом году — занятная и удобная для многих штук вещь оказалась.

Shell

Вообще я не большой любитель unix-систем, мне приятней и удобней за десятилетия встроившиеся в мозг привычки, софт и прочие атрибуты винды (например, меня бесит дизайн и динамика движения курсора мыши в оконных менеджерах Linux, это непросто объяснить — но бесит неимоверно). Но в современном мире без линукса никуда, а значит и автоматизировать всякое на нём и shell придётся. Главное, чтобы задача была. Так, однажды я за вечер написал на shell аналог Fail2Ban для системы которую мы поддерживали — классический вариант, смотрим кого в логах сейчас слишком много и неправильно, и обновляем сетевые правила (в нашем случае — конфиг HAProxy). Идеология линукса «всё-файл» для задач бытовой и наколеночной автоматизации прикольна, и shell в комбинации с утилитами дает хороший простор для манёвра, с достаточно низким порогом входа

Микро- и недо-программирование

Вообще, программирования в нашей повседневной жизни теперь очень много, хоть и не все об этом задумываются. Хотя, нутром это многие понимают — так, еще лет 15 назад к нам в отдел заходили бухгалтерши с просьбой «Ребят, вы же программисты? Запрограммируйте чтобы кондиционер за полчаса до нашего прихода включался и кабинет охлаждал!». Так что, с учетом доступности этих инструментов и моей тяги к автоматизации, постоянно и незаметно применяется много всякого недо-программирования:

  • Автоматизации в IOS (актуальная задача в дивные новые времена — автозапуск и автостоп VPN при открытии на телефоне определенных приложений)
  • Скрипты для Automator — языка (сервиса) автоматизации macOS. Делал на нём всякие переименования файлов и удаления старых выполненных задач из приложения Напоминания
  • скрипты преобразования файлов, расстановки меток и прочего для монтажки VEGAS
  • батнички в винде — люблю автоматизировать рутину, и если что-то можно сделать одним кликом, потеряв день на программирование — обязательно сделаю так. Например, сохранившее мне миллионы миллисекунд жизни решение для выноса часто нужной команды архивирования 7Zip в контекстное меню Проводника
  • бытовое программирование через сценарии для Алисы и других средств управления умным домом. Обожаю сообщать «Алиса, я пришёл» и смотреть как зажигается свет и включается любимая музыка

Подводя итог теме, хочу еще раз восхититься и признаться в любви к программированию. Когда-нибудь у программистов точно получится «make world a better place». Слава роботам!

PURGA на Full Moon Systo Togathering 2022

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

В итоге снято было всё на 7 (кажется) камер, с дронами и стабилизаторами, но из того материала ребята выпустили только один трек. А мне нравится весь концерт — и того, что осталось на гопрошках, вполне хватило для монтажа всего выступления.

Люблю страшно — Лера, Егор и ребята на берегу Финского залива:

Выступление группы PURGA на сцене Голосистое фестиваля Full Moon Systo Togathering 2022, 10 сентября 2022 года

PURGA:
Лера Банина
Егор Богачев
Владимир Меч
Александр Битюцких
Александр Новиков

Группа в сети:
https://vk.com/lerapurga
https://music.yandex.ru/artist/9330327
https://music.apple.com/ru/artist/purga/1517699747

Снято на GoPro Session, звук Zoom H1
Фото на обложке https://unsplash.com/@jorikkleen

Алёша и программирование

Так сложилось, что несмотря на профильное образование, профессиональным программистом я так и не стал. Я постоянно что-то кодю (кожу?) для решения прикладных задач, но пресловутый чувак с зарплатой мильён в секунду, навыками крутить туда-сюда эти ваши бинарные деревья, и обладатель тыщи офферов от фаангов — это не про меня.

Между тем, идея о том что можно заставить электронных болванов делать рутинные, сложные, скучные или невыполнимые для человеков вещи, всю жизнь меня будоражит, и я всегда ищу этому применение. Ярчайший пример — девайс Вадима Смирнова Smirnov Electronics Whammy D2, заставляющий гитарную примочку Whammy переключать режимы в темпе, который недоступен человеку гитаристу — и вот уже возможности кожаного мешка безгранично расширяются услужливой железякой с питанием в 9 вольт, не страдающей от характерных для рокеров запоев, творческих кризисов, и паталогического опоздания на репетицию. Внутре у ней — программа, а всё (от схемы до той самой программы) сделано гениальным сибирским чуваком! Ультравосторг!

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

Бейсик в пк Правец

Бейсик для болгарского компа Правец, который стоял в школьном классе информатики — до сих пор помню команды HPLOT и прочие с H-префиксом. Первые эксперименты типа викторин «вопрос-ответ» и рисования фигур в графическом режиме.

картинка из интернетов, я уже не помню как он выглядел

Бейсик для Спектрума

Буквально пару раз писал на нём что-то в гостях у Сани, в ожидании и фантазиях о покупке своего Спектрума — какие-то приколюхи уровня «нажмите 1 если вы козел, и 2 если осёл. Поздравляю, вы осёл». Что-то в языке отличалось, но не смертельно. Спектрум мне в итоге не купили, изучить подробно язык не сложилось.

Ассемблер для Электроники 8086

Это отдельная, одновременно печальная и смешная история про первый комп, который мне подарил друг Вася. Комп был по тем временам уже сильно устаревший, а CGA монитор в комплекте с посаженной трубкой, поэтому из 4 градаций яркости монохромного экрана была доступна только одна, да и то ночью в полной темноте. В оригинальные игры (а на дискетах в комплекте были Space Quest, Larry и прочие радости) было нереально играть, поэтому я освоил ассемблер и стал писать свои игры, используя только два цвета (точнее, полную яркость пикселей и её полное отсутствие). Были викторины, были угадайки, была ходилка по лабиринту с построением его в текстовом режиме из самостоятельно сгенеренного шрифта, где были символы для разной формы стенок. Исходники и бинарники где-то есть до сих пор, но так как все тайминги были рассчитаны эмпирически под производительность процессора, и игры написаны довольно примитивно, так что уже на 80486 это всё работало неиграбельно быстро. Сейчас полез в интернет и понял, что как выглядел тот комп я совершенно не помню — в голове остался только тёмно-серый цвет блока.

GW-BASIC

Восхитительная тема — бейсик от майкрософт, который можно было компилировать, и в который можно было подключать библиотеки. Тогда у меня уже появился 486 комп c SVGA экраном, и возможности были практически безграничны. Друг Макс написал на языке «cи минус минус» драйвер для мыши, а я на GWBASIC нафигачил несколько приложений с её применением — графический редактор, игру типа 4-в-ряд (с оригинальной идеей, когда в клетках были цифры от 1 до 9, а сгорали дающие в сумме случайное для этого хода число), и тому подобное. На нём же писал проги на городских и областных олимпиадах и в областных лагерях программирования в центре Байтик в Троицке (привозя интерпретатор и компилятор с собой на дискетах). Помню что компилируемый бейсик тогда была редкая штука.

Magician of mathematics, 1996. Have a nice brain!

Бейсик для школьных компов

Это был какой-то диалект бейсика, встроенный в школьные бездисковые машины на базе 80286. На момент 11 класса мы с Максом были уже знатные хакеры, поэтому за урок успевали набить приличные программы, от учебных (для нас элементарных) до гонялок-стрелялок пикселами на два человека. Была классная история, когда мы написали простенький демонстратор страницы в псевдографике с сообщением «Внимание! Идёт форматирование жесткого диска! Не отключайте питание компьютера» и бегающим туда-сюда прогресс-баром. Программу мы успели запустить на первой паре на нескольких компах, а уже после четвёртой встретили преподавателя Степана Васильевича, который попросил нас посмотреть «что там с машинами происходит». Уровень Степана Васильевича (при всём уважении) был таков, что распознать фейк о форматировании диска на бездисковой машине, он сам не смог.

Кодим с Максом что-то за теми самыми 286 машинами. Справа в кадре Степан Васильевич

Pascal

Стандартная школьная и институтская тема для моего поколения, там была сделана куча канувших в лету задач, курсовых для друзей и дам сердца, а также некоторый прикладной софт. Например, на нём в 10 классе была написана читалка служебных ресурсов от игры Wolfenstein, показывавшая полностью карту подземелий (когда у меня появился комп, на котором можно было играть в Wolfenstein).

что-то считаю для алгебры в школе

C и C++

Тут была куча проектов на учебе и первой работе. Клиент-серверное ПО, разбиралки сетевого траффика, программы с GUI на  Borland C++ Builder, очередной домашний каталогизатор дисков с фильмами и музыкой, и даже серверная часть новаторской геолокационно-социальной сети CU, на старте которой меня позвали поучаствовать в проекте друзья.

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

Там ещё много всего, продолжу ностальгировать в следующем посте

Сервис isDayOff для нужд автоматизации

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

Я очень люблю автоматизацию, особенно — автоматический контроль за соблюдением правил и договоренностей в системах. Человеческий фактор невозможно полностью исключить, зато можно заставить дотошных и не устающих роботов контролировать, что человек сделал всё правильно. Однако, здесь кроется одна проблема — человеки, в отличие от роботов, уходят на выходные и государственные праздники. Согласно Первому закону робототехники, робот не может причинить вред человеку или своим бездействием допустить, чтобы человеку был причинён вред. А что может быть противней, чем тикет на исправление некритической проблемы, прилетевший в выходные? Да, можно запрограммировать, чтобы тикеты не прилетали в субботы и воскресенья — но что делать с праздниками и переносами выходных?

isDayOff простой как автомат Калашникова, и легко встраивается в скрипты и пайплайны автоматизации. В простейшем виде через https://isdayoff.ru/today можно узнать, является ли текущий день рабочим, ну а дополнительные параметры к запросу могут дать информацию о любой дате в прошлом и будущем (в разумных пределах) и даже о праздниках в соседних странах (поддерживаются Белоруссия, Казахстан и Украина).

База сервиса активно поддерживается и приводится в соответствие законам, когда принимаются решения о переносах праздников и выходных. Чтобы не потерять функционал при возможном отключении сервиса (а в дивные новые времена обо всём начинаешь думать в разрезе «а что если забанят»), я обычно стараюсь в проектах использовать локальную базу на год вперед, сдампленную с сайта, и обновляющуюся ежемесячно — заодно, локальная копия базы снижает нагрузку на сервис, зачем зря напрягать бесплатное отличное решение.

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

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

Слава роботам!

 25   3 мес   PowerShell   КЭНК

Забрать своё из облаков: обновление вКачатора

Допилил небольшое, но важное дополнение для скрипта обогащения дампов профиля ВКонтакте. Эксплуатация предыдущей версии выявила существенный недостаток: видео с YouTube, импортированные в ВК, в разных разделах сайта фигурируют с разными ID (и разными URL). Выходит странненькое — по этим разным ссылкам открывается один и тот же объект (страницца) ВК, с теми же комментариями, лайками, и прочими атрибутами соцсети, и конечно же встроенный в объект ролик YouTube там тоже один и тот же, но ссылки на этот объект разные. И например, добавленное на стену видео, и то же видео, посланное в диалоге, будут иметь разные адреса. Поэтому старая версия скачивала, и складывала в папку видео несколько раз, что расходовало лишнее место (а у меня в избранные как-то попала даже девятичасовая прямая трансляция выхода в открытый космос с МКС).

Идеально было бы научить скрипт сразу узнавать такие дубликаты по адресам, и не скачивать повторы вовсе, но как это сделать я придумать не смог. Зато можно скачать через yt-dlp оригинал с ютуба, и по его метаданным распознать дубль, сравнив с метаданными уже скачанных видео. Так и поступил — теперь скрипт сохраняет в простой json информацию по всем уже скачанным файлам, и при закачке дубля не сохраняет его на диск, заменяя ссылки в дампе на уже скачанный экземпляр. На моем дампе это значительно сократило объём выгрузки.

Обновлённая версия уже на гитхабе: https://github.com/alexbatishchev/kenk-vk-enricher

ЧТО У ВАС? — отчетный концерт театральной студии «Груша»

Уже много лет дочка занимается в театральной студии «Груша». Организаторы и вечные двигатели процесса — совершенно турбореактивная семья режиссеров и актёров, которые запустили в желдоре и окрестностях целую сеть театральных кружков под единым брендом. Как они успевают заниматься с таким количеством детей и взрослых, и параллельно вести столько проектов, я лично не очень понимаю. Но вот в апреле на сцене ДК «Восход» синергию этого движения можно было увидеть воочию. Работы разных коллективов собрали в театрализованное представление под общей канвой.

Цитирую афишу: «Планета Земля в опасности. По решению Вселенского совета ее могут уничтожить. Почему так произошло, что случилось? Кто же придет на помощь, кто может поменять решение космического суда? Вы увидите театрализацию стихов советских поэтов, скоморошью сказку „Ворона“ Вятской губернии, юмористические истории племени Ту и совершите путешествие в прошлое. В концерте принимают участие воспитанники театральной студии „Груша“ (руководитель Вера Коюшева).»

Получилось весьма пёстро, но цельно, интересная общая концепция и яркие номера внутри её. Отдельный кайф — видеть в работе таких уже взрослых детей своих школьных друзей, и смотреть на счастливых родителей. Да и сама площадка, районный ДК где 25 лет назад мы сами играли по каморкам тяжелый рэп с матом на гитарах Аэлита и примочках Лель — мощнейший телепорт во времени и цунами ностальгии. Еще в который раз впечатляюсь как удивительное дело театрального перевоплощения дается непрофессионалам — детям и взрослым, и как из простого знакомого с детства стихотворения можно сделать целую историю, сыграть и показать его с неведомой стороны и неожиданными художественными приёмами. Актёрам и режиссеру — восторг и восхищение.

По просьбе Веры я традиционно снял представление на видео.

Отчетный концерт театральной студии «Груша» прошел 23 апреля 2023
Студия «Груша» вконтакте: https://vk.com/grushatheatre

Powershell и странненькое с TimeSpan

Авторы Powershell, с одной стороны, многое в своём творении придумали системно и логично. С другой стороны, постоянно натыкаешься на странности, объяснения которым в области логики не найти.

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

Вот свойства Hours, Minutes, Seconds, Milliseconds. Интуитивно думаешь, что это — значение промежутка времени в часах, минутах, секундах, и миллисекундах. Довольно быстро наступаешь на эти грабли, и узнаёшь, что это кое-что другое, а именно количество часов в рамках дня, минут в рамках часа и тому подобное. То есть, если промежуток времени у вас в 1 день и 1 час, то Hours — не 25, а 1. А если между датами прошло 2 часа и 10 минут, то свойство Minutes будет не 2*60+10, а просто 10. Зачем это надо? Ну, наверное для чего-то может пригодиться, хотя я ни разу за много лет эти свойства не использовал. Зато, сколько ошибок в скриптах из-за неверного их понимания я встречал на стековерфлоу и в прочих местах в интернетах!

Окей, столкнувшись с этим (или прочитав заранее в документации, что вряд ли), ты спустя какое-то время познаешь TotalHours, TotalMinutes, TotalSeconds и TotalMilliseconds, с той самой очевидной логикой «полное количество часов между датами» и так далее. Если между моментами времени прошло два с половиной часа, то это будет 2.5 TotalHours, 150 TotalMinutes и 9000 TotalSeconds. Ура, теперь-то всё понятно, можем смело фигачить!

И вот в этот момент, к полному сил и умиротворённому программисту, из-за угла подходят в кепках и адидасе братюни Days и TotalDays, и объясняют, что понятий он не знает, и вообще зря на раён зашел. Ибо Days — это в в натуре полное количество дней (а не как можно было бы по аналогии предполагать, количество дней в рамках года). А TotalDays — это да, это полное количество дней, дробь (типа, аккуратно посчитанное, вкуриваешь?). А Days — грубо посчитанное. Но полное. Почему? Короч, так надо. Кстати, дай позвонить!

И вот, сидишь, смотришь на это, и думаешь — а оно зачем вообще так?? Потом вздыхаешь, материшься, сверяешься с документацией ещё раз, пишешь в коде правильное.

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

Дорогой Вася! Если тебе надо посчитать промежуток времени, юзай TotalDays, TotalHours, TotalMinutes, TotalSeconds и TotalMilliseconds, помни что они — вещественные, и означают то, что тебе нужно. А про другие свойства TimeSpan забудь!

А для вас — картинка, иллюстрирующая всю дичь TimeSpan

Слава роботам!

Сети в к8s

Цикл заметок о сетях в Kubernetes от Mark Betz переводился на хабре несколькими участниками. Поэтому в нормальный единый цикл заметки не объединены, но поиском по имени оригинального автора их можно найти. А можно воспользоваться этим списком:

Тренировки по алгоритмам от Яндекса

Вписался несколько недель назад в марафон-контест от Яндекса — лекции по алгоритмам, задачки-домашки, и финальный этап, где за 3 часа нужно решить заключительный блок задач. Совместил приятное с полезным — вспомнил чудесные школьные годы и олимпиады по информатике в троицком Байтике, прокачал знания алгоритмов и систематизировал то, что давно стало привычным в работе, но не было уложено в красивые рамки и точные формулировки «О большое», набил руку в питоне и просто покайфовал, катая трактора по каменистым полям, связывая гвоздики верёвочками и высчитывая идеальные схемы бюджетного питания в выдуманных столовых. Было очень хорошо.

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

Плейлисты с лекциями и разборами домашек на ютубе:
Сезон 2022:

Сезон 2023:

Архивируем почту из Gmail в Thunderbird

Gmail впервые ввел концепцию ярлыков и тегов в апреле 2004 года, когда сервис и был запущен компанией Google. Ярлыки в Gmail позволяют пользователям категоризировать свои электронные письма в разные группы, что делает управление и организацию инбокса проще. Ярлыки можно присваивать отдельным письмам, а одно письмо может иметь несколько ярлыков, чтобы категоризировать его по нескольким критериям.

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

По совокупности нескольких факторов я выбрал для синхронизации и хранения локального архива почты Thunderbird. При действиях над письмами особый подход гугла показывает себя тут во всей красе.

Во первых, письма классически дублируются в разных папках, если в Gmail на них навешаны несколько ярлыков. Во-вторых удаление писем работает совершенно непредсказуемо: например, письмо может удалиться из одной папки и остаться в другой. Или полностью удалиться изо всех папок в Thunderbird включая корзину — но остаться болтаться в корзине веб-интерфейса Gmail (с ярлыками «Корзина» и остальными кроме первого, из папки которого вы его удаляли). А ещё, Thunderbird показывает папку All Mail — и значит по умолчанию пришедшие письма будут показаны два раза и во Входящих, и в ней. Но удалять письма из All Mail нельзя — они «воскресают» после повторной синхронизации, потому что по логике гугла в All Mail лежит всё и всегда, даже если оно без ярлыков.

Знатная бредятина и непонятное? Это ещё не всё. Описанное поведение — при умолчальных настройках Gmail и Thunderbird. А есть еще и другие варианты — поведение гугла при работе через IMAP описывается разделами в настройках «Когда я помечаю сообщение в IMAP как удаленное» и «Когда сообщение помечается как удаленное и стирается из последней видимой папки IMAP», а сам Thunderbird по умолчанию перекладывает письма в папку удалённые Gmail, но может их и стирать у себя (и передавать команду IMAP на сервер). Надо ли упоминать, что splitbrain с ярлыками тут тоже играет и внятного сценария получить не выйдет, письма продолжат дублироваться и воскресать? На самом деле, область исследований тут на небольшую диссертацию, возможно кто-то когда-то победит.

Хорошо, что мне от Thunderbird была нужна только архивация Gmail в оффлайн (и дальнейшая работа с архивом всей почты скопом) — щас расскажу как это победил.

Усмиряем ярлыкобесие

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

С Gmail команда Archive не работает: Thunderbird копирует письмо в заданную в настройках архивирования папку, однако из папки All Mail (Вся почта) оно не удаляется (точнее, пропадает и появляется вновь). Перетаскивание писем через drag-n-drop работает так же — они переносятся в локальную папку, а после синхронизации воскресают в All Mail. Поведение неинтуитивное, пользователи в интернетах ноют и получают рекомендации руками копировать письма, потом их удалять из All Mail, а потом еще и удалять из корзины внутри веб-интерфейса gmail. Но мы заставим работать роботов.

В Thunderbird есть механизм правил, где можно задать фильтр писем и действия, которые применяются над ними (можно применять правила на выделенные в интерфейсе письма или на папку целиком). Благодаря этому механизму запилен такой сценарий:

  • сделано правило для всех писем, подходящих под архивацию (я архивирую всё, что не отмечено звёздочкой в gmail, и это условие отбора)
  • первым действием в правиле копируются отобранные письма в локальную архивную папку
  • вторым действием в правиле отобранные письма удаляются

Командой в интерфейсе Thunderbird применяем правило на папку All Mail, а после его отработки нужно завершить шаманство, применив команду очистки Empty Trash на папку Thunderbird Корзина — именно так, потому что если зайти в Корзину и удалить письма, Gmail это благополучно игнорирует по своей безумной логике, и IMAP-некромант продолжит свой безумный танец. Почему очистку корзины и удаление писем из неё Thunderbird преобразует в разные для Gmail операции — вопрос к разработчикам Mozilla, это неинтуитивно но ок, просто запомним как мантру.

Кстати, еще один нюанс — переписки (chats), которые gmail хранит в себе, он не отдает в виде сущностей «почтовое сообщение» через IMAP (в отличие от заметок, например). Благо, их у меня в архиве совсем немного (и я не уверен что вообще сейчас этот сервис), но подметил что при синхронизации они недоступны. Выгружу один раз руками.

Такие дела. Слава роботам!

Ранее Ctrl + ↓