Дополнение для Chrome и прогулка после дождя

С тех пор, как я переехал за город, прошло уже больше месяца. Кажется, что заезд был очень-очень давно, а жизнь до эпидемии — вообще каким-то сном. Но увы, перестроиться на дачный режим жизни не получается. Видимо, дело не в том, где я нахожусь, а чем занимаюсь. Раньше, приехав на дачу, особенно весной, я выбирался и гулять, и кататься на велосипеде, а когда оставался дома, значительную часть времени проводил в оффлайновом режиме. В этот же раз всё не так.
Впрочем, в начале недели был момент, когда вроде бы начал выравнивать режим дня. Но увы, во вторник снова «сорвался», хоть и отключил Интернет рано вечером, всё равно засиделся до 5 утра, перечитыая «Драму на Ниобее» Сергея Снегова. (Хех, вот она, непредсказуемость потока жизни, которым меня вечно сносит: утром получил рассылку ЖЖ, в одном из комментариев упоминался этот автор, я решил поискать его в своем книжном архиве, и вот и результат…)
В среду проснулся поздно и был весьма недоволен этим фактом. Да и вообще, всё раздражало. По-прежнему было ощущение жуткой нехватки времени и увязания в болоте жизни: не было прогресса по своим задачам, во вторник накидали всякой фигни по freelance, да и погода сказывалась. К тому времени уже несколько дней подряд дожди шли почти непрерывно. У нас даже на участке начали грибы расти в огромных количествах, жаль только, что несъедобные. Вышел ненадолго в Сеть проверить сайты и глянуть обстановку на рынке. И вдруг понял, что всё раздражает. Решил отключить связь, и большую часть дня провёл в оффлайне. Удивительно, но это помогло: понемногу стало возвращаться ощущение внутренней целостности.
Увы, бессознательное сыграло со мной злую шутку. Оно полностью вытеснило то, что я пообещал Tellе выйти на связь в 22 часа (если бы не логи, которые могут врать, я бы и не поверил, что это было). Она кинула SMS, но её я тоже не увидел. И только где-то через час с небольшим, когда она прислала вторую, я вышел на связь. За это время она успела сильно «разогнаться» эмоционально, и ушло много времени на то, чтобы её успокоить.
Потом снова ушёл в оффлайн, поиграл немного в Ultima IX, завершил один из самых глючных побочных квестов. И наступил момент, когда все известные мне квесты выполнены, и главному герою приходит время отправляться в последний путь (в буквальном смысле этого слова) на остров Терфин. На этом я вышел из игры и уже подумывал было пойти спать, но тут случилось непредвиденное. Пока я днем сидел в оффлайне, у меня в голове снова возникала мысль о том, что хорошо бы сделать расширение для броузера, которое выделяло бы пользователей ВК с закрытым профилем. И вот в голове сложилась целостная картина, как это должно быть сделано.
Как писать расширения, я помнил очень смутно, поэтому для начала ограничился скриптом, который вставлял через консоль. Но на JavaScript я пишу мало и редко, поэтому долго провозился с отладкой. Причем большинство ошибок оказывались довольно глупыми. Самая частая, например, — это забыть об элементе верхнего уровня в присланном ответе, если он всего один, а пытаться сразу залезть в элемент следующего уровня. Из-за этого засиделся до 6 утра, а потом, когда всё заработало, еще не сразу мог уснуть из-за эмоционального подъема, который это вызвало.
Тем не менее, на следующий день проснулся даже раньше 12 часов. Естественно, состояние и работоспособность при этом были далеки от идеальных. Но тем не менее, я сел теперь уже за написание полноценного расширения. Сначала всё шло вроде бы хорошо: просто написал manifest.json, в котором прописал подключение уже написанного кода в качестве content script, сделал значки разных размеров и написал описание. Но затем решил немного всё облагородить, если так можно выразиться — вынести оформление выделенного пользователя в отдельный CSS-файл, учесть лимиты обращений к VK API, динамическую догрузку контента, сделать описание на русском и английском и т.п. Но со всем этим провозился еще несколько часов. В частности, очень надолго застрял при выносе стилей в CSS по очень глупой причине: забыл убрать кавычки вокруг значения свойства border. Из-за этого скрипт отрабатывал как надо, класс применялся, но внешне аватар пользователя никак не менялся. А из-за недосыпа была снижена внимательность, и долго не мог этого увидеть, ломая голову, что же идёт не так.
Настал момент, когда вроде бы всё заработало. Я решил отдохнуть и немного прогуляться по поселку, воспользовавшись тем, что в четверг потеплело. К этому времени как раз дождь кончился, и я отправился в путь. Идея гулять сразу после дождя оказалась очень удачной! Воздух был очень чист и прозрачен, на дороге оставалось еще много луж, в которых можно было рассматривать отражения облаков и деревьев, а на траве и кустах сирени — капли дождя. Я взял с собой фотоаппарат и отснял серию фотографий, которую так и назвал — «После дождя». Правда, выложил пока только в Instagram, где фото очень сильно уменьшаются и теряют в качестве. Но даже в таком виде фотографии очень понравились Tellе и goblincat.
Вечером вновь вернулся к работе над расширением. Стал готовить приложение к публикации, упаковал в CRX-файл. И тут меня ждала еще одна неожиданность. В какой-то момент регистрация в качестве разработчика на Chrome Store стала платной! Из-за этого пришлось отказаться от планов выложить расширение туда. К счастью, еще не всё прогнило в этом мире, и в аналогичном сервисе Opera можно выкладывать бесплатно. Но увы, у Opera пользователей гораздо меньше… Также решил выложить исходный код на GitHub. Но и тут без напрасных потерь времени не обошлось. При создании репозитория не указал, что не нужно его инициализировать файлами README и лицензией. Из-за этого никак не получалось синхронизировать его с локальным git-репозиторием. Так и пришлось удалить и создать заново пустой, и только после этого git push сработал.
Но тут меня ждала другая неприятность. Около полуночи расширение вдруг перестало работать, сначала в Opera, а потом и в Chrome. Стало выдавать ошибку, что fetch-запрос заблокирован. Писалось что-то про CORS. Я попытался было экспериментировать с режимами запроса или искать решение в Интернете, но к тому времени уже сильно хотелось спать и голова не соображала. На следующий день решение всё же нашлось. Оказалось, что совсем недавно произошло очередное ужесточение требований к безопасности: теперь из content-скриптов нельзя делать fetch-запросы вообще. Нужно выносить их в background worker. К счастью, там, где я это вычитал, приводился пример кода, который я смог быстро адаптировать для своих нужд. И вот, через несколько попыток расширение снова стало работать! Обрадовавшись, я побежал его пересобирать и выкладывать в Opera Addons. Но увы, попользовавшись им еще немного, обнаружил еще одну ошибку. Почему-то в списке участников группы оно правильно выделяло приватных пользователей только при первом заходе туда, а потом всё слетало. Ещё час, если не больше, я ломал над этим мозг. Потом причина ошибки обнаружилась: не вызывалась функция, отвечающая за само выделение аватаров, в том случае, если на странице добавлялись новые изменения в DOM-дереве, но не появлялось новых пользователей. Причем об этой ошибке я думал ещё вчера днём, хотел её исправить, но что-то отвлекло, а потом вылетело из головы. Снова пересборка crx-файла, снова выкладывание для Opera. И тут я захожу в чат и обнаруживаю, что пользователи не выделяются там. К счастью, этот вопрос решился быстро, но даже тут я не смог не сделать глупой ошибки: сначала для одного из классов забыл точку в селекторе. И вот только после этого я смог сказать «ну всё, вроде работает».
Так что сегодня у меня новый, совершенно внеплановый пуск! А еще это небольшая дополнительная опора личности (причем даже не само расширение как еще один пункт в списке моих проектов, а именно само знание, как их создавать). Ну и конечно же, избавление от того, что давно меня раздражало — заходить в чей-то профиль, и натыкаться на сообщение, что он закрыт.
Еще была мысль написать статью на Хабр, где подробно расписать весь процесс разработки и проблемы, которые я решал в процессе. Но ресурса на это уже нет: весь интерес к задаче выгорел еще сегодня утром, когда я решил проблему с CORS. Остальное доделывал уже на упорстве и принуждении себя. Эх, «проклятье трёх дней» по-прежнему действует…
А еще сегодня было лунное затмение. Увы, узнал о нём слишком поздно, и увидеть его не удалось. Зато ночью просто ненадолго вышел из дома и посмотрел на Луну и звёзды, послушал соловья. Это немного успокоило и стабилизировало эмоциональное состояние. Но быстро замёрз и вынужден был вернуться обратно.