Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Содержание
Предпосылки
История версий
Первая версия. Блин комом.
Вторая версия. Разделяя, властвуй.
Третья версия. Конструктор Лего и его проблемы.
Четвёртая версия. Знакомство с коробками.
Пятая версия. У провайдера проснулся аппетит и немного про предательство близких.
Шестая версия. Интим с очередным провайдером, после которого у меня появилась девушка.
Предпосылки
Когда я работал дворником, носил с собой простой кнопочный телефон, ввиду его удобства. И особенно в зимнее время мне не хватало такой штуки, которая присылала бы мне прогноз погоды по SMS. Кое какие уведомления получалось настраивать через почту, однако прогноз погоды так настроить никак не удавалось. Ещё меня не устраивало то обстоятельство, что формат сообщений нельзя кастомизировать.
Получалось так, что сообщение на телефон могло прийти в обрезанном виде
или без реально необходимой информации. Например, из полноценного предложения
мне нужна лишь пара чисел. Или мне не хватает короткой ссылки. В то время
как формат SMS сообщения серьёзно влияет на его стоимость.
Начинал программировать я на С для Windows. У меня была IDE в виртуальной машине. А сорцы разложены по рабочему столу, как в песочнице. А мне ещё нужна была отдельная страничка для портфолио, потому что меня заблокировали на одной фриланс бирже и даже не дали забрать портфолио. Кто в политике что то понимает, тот поймёт меня правильно. Таким образом я попробовал зайти в веб, через клепание в CMS. Поставил Apache в Windows. Но потом понял, что это всё не то. Например, Wordpress написан на интерпретируемом языке PHP. Поэтому я решил изучить этот язык, Потому что для того, чтобы сделать какую то страничку мне нужны не инструкции, а понимание основ. Абстракции быстро выветриваются из за их разнообразия, а основы помнятся легче.
Тем временем, у нас на работе, незадолго до моего увольнения, начали переходить на Linux. И тогда я обратил внимание на эту ось. Windows не поддерживает множество возможностей из тех, что поддерживаются в Linux. Например posix.
История версий
Первая версия. Блин комом
У меня возникла идея написать "уведомлялку" на php. Так появилась первая версия. Эта версия работала под управлением Linux Ubuntu Server 16 с установленным веб-сервером Apache и её нужно было запускать из браузера. Она периодически парсила сайт gismeteo и отправляла мне на телефон SMS. Однако, к тому времени я уволился и первоначальный функционал стал не нужен. Но принцип работы мне понравился из за того, что можно парсить любой сайт и присылать полученный сгусток информации в виде уведомлений. Тем более я начал искать другую работу и мне нужно было получать свежие вакансии по SMS.
Вторая версия. Разделяя, властвуй
Первую версию было сложно изменять, код при этом быстро становился слишком запутанным. И я разделил программу на три функциональные части. Первая открывала UNIX сокет и начинала его слушать. Появившиеся в сокете данные отправлялись на телефон. Вторая часть - это демон, периодически вызывающий парсинг с произвольного сайта и направляющий результаты в сокет. Парсер выполнен в виде плагина. Фактически, здесь изменяющиеся части - это парсер и основной скрипт, где прописывается их вызов. Внешне, функциональность первой и второй версии отличается тем, что я добавил сокращатель ссылок, т.к. короткую ссылку можно прислать на телефон. У меня был парсер для одного сайта, но мне нужна была информация из нескольких источников. Подключить произвольный парсер во второй версии сложно. Кроме копирования собственно
скрипта на сервер для этого необходимо вносить изменения в основной скрипт и перезапускать программу.
Третья версия. Конструктор Лего и его проблемы
В третьей версии реализован динамический поиск и выполнение кода парсеров.
Но что движет совершенствованием? Проблемы! В третьей версии есть проблема, касающаяся безопасности. Плагин запускается на выполнение, в качестве самостоятельного процесса в окружении интерпретатора. Это значит, что программе предоставлены более широкие права, чем в окружении сервера. Особенно, если запуск идет из crond (root права). И плохо написанный скрипт запросто может сломать систему. По прежнему нельзя изменить запрос без перезапуска программы. Ещё нет спам фильтра, благодаря отсутствию которого у меня сожрали весь баланс. Спам фильтр добавил с наивысшим приоритетом, несмотря на то что имеются и архитектурные проблемы и проблемы с безопасностью подключаемых парсеров. Не все парсеры отлажены как следует, а формат вывода неудобен и
приходилось изменять логику. В результате некоторые вакансии парсер проглатывал. В скриптах были жёстко заданы пути и константы (как номер телефона), и в случае чего сбои сложно заметить.
Четвёртая версия. Знакомство с коробками
Четвёртая версия - монолит, в котором тяжело отлаживать конкретный функционал. Следуя философии Unix (каждая программа делает хорошо одну вещь), планировал её разделить на демоны и утилиты. Утилиты - это парсеры, обработчики и сендеры (почта, смс, push), а демоны будут при определённых условиях их вызывать в отдельном процессе. И добавил новые каналы доставки информации, в телегу в частности.
Примерно до середины лета 2022 года сервис работал на локальной машине. Это было неудобно, так как приходилось постоянно держать машину включенной, ну может быть отключая её лишь на выходные. Плюс, виртуальная машинка с сервачной убунтой неслабо жрала память (1 ГБ из 8). И перенёс я сервис в облако. Есть веб-хостинги, которые даются бесплатно и насовсем, однако веб-хостинг мне не подходит, так как у меня в сервисе есть демон, который нужно запускать в качестве самостоятельного процесса. Я выбрал виртуальный частный сервер. Кстати, у зарубежных товарищей я как то не рискнул. Я начал регаться в Amazon в январе, а в мае уже не смог завершить регистрацию. Однако, во первых, в облачной виртуальной машине пришлось заново настраивать окружение: настраивать веб сервер, интерпретатор PHP. А во вторых, стоит всё удовольствие очень дорого. Поэтому в ближайшее время я запланировал запихать сервис вместе с окружением в Docker и найти провайдера с услугой управления контейнерными приложениями, т.к. тупо меньше расход ресурсов. И в октябре я таки приручил контейнеры. Заодно перенёс программу на другой, более дешёвый, сервер. Что запомнилось: не нужно настраивать окружение вручную, настройку окружения можно автоматизировать и не засорять VDS ненужными компонентами.
Пятая версия. У провайдера проснулся аппетит и немного про предательство близких
В пятой версии добавлено кеширование. Некоторые ресурсы не позволяют задавать запрос, а выдают статическую страницу. Чтобы сделать несколько проверок на соответствие запросам, страница кешируется. Длительное кеширование ей не нужно, достаточно похранить страницу до завершения всех проверок. Также изменён SMS провайдер, прежний начал насиловать мозги. Я лишний раз убедился в правильности архитектуры, заменив сендер.
Сделано это потому, что мне понадобилось добавить парсер заказов, в дополнение к уже существующему парсеру вакансий. Если бы ресурсы были однородными, не пришлось бы делать проверку на соответствие запросам. Только вот сервис опять начал неистово жрать деньги. Пришлось улучшить спам фильтр. Добавил исключающие ключевые слова (аналог стоп листа), вернул старую проверку записи на свежесть и проработал код, так что его легко перерабатывать далее. Фильтр работал так, искал записи, попадающие под запрос, затем искал исключающие слова, затем проверял запись на свежесть, если первые две проверки пройдены успешно.
Если заказ мне не нужен, но описание не содержит исключающих слов, запись пропускается дальше, т.к. подразумевается, что я, получив SMS, могу это решение принять и не хочу попустить ничего важного. Это немного снижает эффект фильтра (мы хотим экономии). Ещё имеется ввиду, что если в сообщении попадаются исключающие слова, то оно будет неинтересно для меня. Если я не умею писать на Питоне, мне не нужны заказы, содержащие в своём стеке python. Если действительно интересный заказ не содержит в описании запрашиваемых ключевых слов, то к сожалению его не пропустит фильтр. Заказчик может описывать вставшую перед ним проблему без технических подробностей, в то время как я ищу информацию о языке программирования, операционной системе. Неспецифичные слова в запросе я не использую намеренно, т.к. они могут применяться в различном контексте. Для фильтра подходят названия технологий (Bitrix, Angular, JSON) и профессиональный сленг (лендинг, бот и т.д.). То есть, в отношении специфичных слов программа в состоянии принять однозначное решение. Заказ, в описании которого есть слово "программист", но нет запрещённых слов, не может быть отфильтрован.
Таким образом мне на мобилку поступило предложение поработать бухгалтером, в описании заказа есть какое то упоминание программиста.
Уже после того как я добавил спам фильтр, некие личности научились его обходить.
Всё потому, что спам фильтр сравнивает вакансию с устаревшими данными. Но, изменив описание вакансии или предлагаемый оклад, можно обойти проверку. Пришлось добавить стоп лист. В стоп лист заносятся ключевые фразы или слова, каждая с новой строки, например ФИО предпринимателя. Одного экземпляра я так запомнил. Пусть идёт теперь в УФМС родословную меняет.
Шестая версия. Интим с очередным провайдером, после которого у меня появилась девушка
К появлению шестой версии привело то, что новый провайдер начал требовать договор. А началось это с того, что я написал в техподдержку. У них есть возможность получения статуса доставки сообщения. Мне нужно было узнать о возможности повесить обработчик на их сайт, но не в настройках, а программно. Спросил на свою голову, так сказать.
Дело в том, что SMS не пропускают, ссылаясь на рекламную формулировку. Причём формулировка от меня не зависит совершенно, это судьба, злой рок. А для того, чтобы производить рекламные рассылки, нужно заключить с ними договор. Но я о рассылках ведь даже не думаю, я отправляю уведомления чисто на свой номер телефона. Тем более, нужно регистрировать юрика, что мне абсолютно не нужно. Если б я был МЧС и рассылал сводки о погоде, то да.
Фотка моей девушки
В итоге, в шестой версии я заменил SMS доставкой в Telegram.
Как-то так. Но мне смски как-то больше нравились. Нужно держать постоянно работающее приложение, в случае с мессенджером или почтовым клиентом. Хотя с другой стороны, с точки зрения стоимости, SMS более затратны, мой провайдер брал 4 рубля за один сегмент (пока с ума не начал сходить, за неотправленные SMS они ничего не берут).
Телега@vasyusha_artemov95