БАГодельня @bug_makers Channel on Telegram

БАГодельня

@bug_makers


Закулисье заказной web-разработки: код, кейсы, процессы и размышления.

Вещает руководитель отдела разработки: @ipatove

БАГодельня (Russian)

Добро пожаловать в БАГодельню - Telegram канал, где вы сможете окунуться в мир заказной web-разработки. Здесь вы найдете коды, кейсы, процессы и размышления о создании веб-проектов.

Курирует контент на канале руководитель отдела разработки @ipatove, который делится своим опытом и знаниями в этой области. Если вы работаете в сфере веб-разработки или интересуетесь этой темой, то этот канал станет для вас настоящим кладезем полезной информации. Не упустите возможность узнать о тонкостях и секретах заказной разработки из первых уст. Присоединяйтесь к нашему сообществу и расширяйте свои знания вместе с нами!

БАГодельня

06 Jan, 07:02


Топ публикаций за месяц

📖 Ежемесячная рубрика с 5-ю самыми популярными постами за месяц.
В подборку попадают публикации за прошлый месяц, по количеству реакция плюс количество пересылок в личные сообщения или группы – за каждое действие по одному баллу.

📌 Топ 5 постов за декабрь

1️⃣Как не нужно присылать примеры работ
Рубрика #Мысли

2⃣Оптимизация запросов к api google
Рубрика #КодРевью

3⃣«Дырявый» сайт Renault
Рубрика #Юмор

4⃣Быстрой поиск долгих sql-запросов в MySql
Рубрика #БазаЗнаний

5⃣SSH-туннель к удаленной базе данных
Рубрика #БазаЗнаний

#Топ5Месяца

БАГодельня

05 Jan, 07:02


Отправка запроса cURL-ом через прокси

📖 Последние несколько лет тема блокировок довольно актуальная, то РКН блокировал сервисы, теперь и сами сервисы русские ip-шники не пропускают. Приходится постоянно что-то мудрить с VPN и прокси. Если через браузер и установку приложений уже все научились обходить запреты, то с отправкой запросов из кода могут быть сложности.

Для запросов с серверов и хостингов действуют все те же ограничения, что и для пользовательских ПК, поэтому некоторые запросы к сервисам могу точно так же блокироваться и получить ответы от api или спарсить какие-то данные может быть проблемой. Для обхода можно настроить vpn на сервере, чтобы поменять его ip. А можно просто сам запрос пустить через прокси.

📌 Для отправки запроса через прокси удобно использовать cURL, это приложение уже имеет все нужные настройки, достаточно только передать правильные флаги. cURL можно использовать во многих языках программирования, поэтому решение подойдет почти всем. У меня была заготовка на php, поэтому его пример и выкладываю. Чтобы было понятнее, добавил комментарии к коду. И написал тестовый эндпоинт, к которому можно «постучаться» и получить в ответ IP, с которого пишел запрос – проверить, работает прокси или нет.

❗️Код длинноват, в пост не поместится. Залил пример исходников в онлайн-сервис, посмотреть можно тут по ссылке: пример запроса.
В примере используется бесплатный прокси, возможно он уже не актуален будет. Для тестов найти рабочий прокси можно быстро в интернете, вот пример сервиса со списком – первый из гугла: ссылка. Бесплатные прокси только для баловства и отладки можно использовать, в реальных проектах нужно использовать платные или свои, для стабильной работы.

📌 P.S Тестовый эндпоинт, при обращении к которому, можно получить IP-адрес: https://owl-dev.ru/ip-checker/

#БазаЗнаний

БАГодельня

31 Dec, 10:10


С Новым Годом!

📖 Канал появился совсем недавно – 1 сентября, всего четыре месяца назад, но уже успело собраться довольное большое сообщество. Это приятно и радостно, спасибо всем подписчикам за это!

📌 Во второй половине декабря посты не так часто выходили, как хотелось бы, но замело предновогодней суетой. Да и режим «по посту каждый день» тяжело поддерживать. Чтобы график выхода публикаций стал регулярным, с 3-5 января посты начнут выходить через день, такой график уже реальней соблюдать.

❗️ И самое главное, ради чего пост – новогоднее поздравление.
Пусть в новом году ваши скрипты и программы будут безупречными, а код работает без багов и ошибок. Желаю вам много интересных и успешных проектов, легкого решения сложных задач и постоянного развития. С Новым годом!

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

P.S. К посту приложил статистику канала за 2023 год(1 с сентября по 30 декабря).

БАГодельня

23 Dec, 07:02


Нейронки – добро или зло?

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

📌 Но важно понимать, что gpt это просто один из инструментов поиска информации, он не может заменить все остальные. Нейронка не дает 100% верную информацию. Она ошибается, а иногда и придумывает ответы. Любой результат, сгенерированный нейросетью, нужно обрабатывать и дорабатывать. И если нет компетенции проанализировать ответ gpt, то это не приведет ни к чему хорошему. Рано или поздно можно наломать дров с таким подходом к поиску решений.

📌 Мало того, что нейросеть может «обмануть», так она еще может запутать и мешать учиться. Большой статистики у меня нет, пока только несколько прецендентов случилось. Возможно, это частные случаи, но они заставляют задуматься.
Несколько раз уже попались ребята, которые пытались учиться по ответам gpt. Какие-то элементарные вещи понимают, но общую картину не видят, а логику не понимают, после долгого общения с нейросетью. А самое главное, что не развивается навык поиска и анализа информации – что-то нагуглить или откопать в документации является проблемой.

Нейросеть агрегирует информацию из большого количества источников, «переваривает» и отдает уже подготовленный ответ. Это как раз то, что обязательно должен уметь разработчик – анализировать, переваривать и додумывать. Нельзя полностью перекладывать этот процесс на нейронку, иначе толку от такого специалиста ноль. Если не научиться самостоятельно обрабатывать разрозненную информацию и «мержить» ее в нужный результат, то любая не стандартная ситуация будет моментально выбивать из колеи и приводить в ступор.

❗️Я не призываю отказаться от использования gpt, но хочу сказать, что не нужно становиться «оператором нейросети». Нужно учиться и постоянно тренироваться самостоятельно искать информацию и анализировать ее. А при использовании ответов нейронок, вникать в суть и перепроверять предложенные решения.

#Мысли

БАГодельня

22 Dec, 06:36


Уникальное имя пользователя

📖 На одном проекте, который дорабатываем, долгое время авторизация была реализована через соц.сети и по логину/паролю. Решили для удобства и сбора емейлов, добавить регистрацию и авторизацию через email. Новая форма регистрации состоит из трех полей: имя, email и пароль. Имя нужно для вывода в личном кабинете и для «общения» с пользователем – в сервисе много интерактива, где нужно знать, как зовут авторизованного посетителя.

Чтобы лишнего не переделывать и не добавлять в структуре базы данных и коде, таблицу в БД вообще оставили без изменений, а в коде решили добавить генерацию username(логина). Поле username в БД и моделе пользователя описано, как обязательное и уникальное, поскольку на него завязана авторизация через логин. А поле email, которое по дополнительному способу регистрации, и раньше проверялось на уникальность, только записывались данные не из формы, а при входе через соц.сети, подтягиваясь из аккаунта.

📌 Генерацию username можно реализовать несколькими способами. Самый простой – генерировать уникальный id или хеш. А можно и дублировать email. Решили записывать почту пользователя в username, все равно при входе по емейлу, логин ни где не виден и нужен только для заполнения поля, чтобы не добавлять лишние условия.

Быстро сделали, апнули, проверили – все ок, и пошли заниматься другими задачами. Но спустя время начали появляться жалобы от пользователей, что не получается зарегистрироваться. Стали разбираться в чем дело и нашли опечатку в коде, которую проглядели и на ревью и при мерже. Код на скрине. В username(логин, который должен быть уникальный), вместо емейла записывается first_name(имя пользователя).

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

И смешно, и не очень – сервис потерял часть пользователей, не сразу заметили проблему. Зато собрали базу уникальных имен.

#Юмор

БАГодельня

21 Dec, 06:36


SSH-туннель к удаленной базе данных

👨‍💻 Я прогулял недельку, оставил канал без постов – в отпуске был. Но уже вернулся и лента должна ожить, если не заметет предновогодними делами. Про свои прогулы писал в чате канала, можете подключаться: чат. Сейчас там не много людей, но бывает чат оживает и обсуждаем канал, разработку или просто шутим и делимся новостями.

📖 Теперь к делу. Сегодня пост про ssh-туннели, которые можно быстро создавать для подключения к удаленным портам, чаще всего это порты баз данных, например mysql. Такие обычно порты закрыты для доступа со хостов, кроме локального. И чтобы подключиться к БД, нужно настаивать новый доступ для конкретного IP или запускать на сервере phpMyAdmin или Adminer. Одноко, есть и способ проще – создать ssh-туннель, через который можно подключиться к удаленному сервису.

📌 Пример подключения к mysql через консоль в Linux и MacOs:
ssh -f -N -L 1234:localhost:3306 [email protected]


Расшифровка:
ssh -f -N -L порт_для_туннеля:хост_бд:порт_бд логин_ssh@удаленный_хост


После запуска команды, нужно будет ввести пароль пользователя ssh и туннель будет создан.
Останется только подключиться к mysql, но используя порт туннеля(1234), вместо 3306. И хост подключения будет локальный: localhost. Логин и пароль не меняются.

📌 Для windows, можно воспользоваться программой putty и через ее консоль проделать тоже самое. Командой в консоле не пробовал, сейчас нет под рукой windows, но в putty точно можно создать туннель прямо из настроек программы.
Если кто-нибудь попробует подключиться на windows с помощью команды в терминале, то сообщите в комментариях) Интересно, сработает или нет.

❗️Такие туннели можно прокидывать к любым портам, не обязательно к mysql, а и к любым другим приложениям и процессам, закрытые «наружу» и доступные только с localhost.

#БазаЗнаний

БАГодельня

14 Dec, 06:36


Оптимизация запросов к api google

📖 На скрине два куска кода. Верхняя часть из экшена, который выполняет восемь разных действий с папками и папками на диске google drive. Вся работа с файлами на гугловом диске происходит через официальные апи, но с надстройками из сервисных классов. Нижний кусок кода – один из методов, чтобы стало понятнее первая часть.

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

📌 Api google drive довольно медленные, например, запрос на создание папки может выполняться от 0.5 до 1-1.2 секунды. Это очень долго. А учитывая, что php, на котором реализована логика, выполняет инструкции по порядку, то эти восемь запросов будут выполняться друг за другом и все это безобразие подвиснет на 8 секунд.

Чтобы ускорить и оптимизировать код, нужно использоваться пакетную отправку запросов. Для всех сервисов от гугла, api умеют собираться в один запрос и отправлять пачкой. В разделе официальной документации для гугл диска не нашел сходу «best practices», или плохо искал или раздел не такой популярный, а вот в документации по работе с гуглоками, такой блок документации есть. И в нем рекомендуют использовать именно пакетные отправки запросов: ссылка. Описанный пример актуален для всех продуктов гугла, а не только docs или drive.

❗️Примечание. Для api, которые лимитированные (платные или бесплатные), не важно, каким образом были сделаны запросы – 10 раз по одному или 10 апи в одном пакете. Лимиты будут посчитаны на основании количества использованных api, то есть 10 раз. Пакеты не помогут сэкономить лимиты.

#КодРевью

БАГодельня

13 Dec, 06:36


Как не нужно присылать примеры работ

📖 На скрине кусок переписки, как прислали примеры своих работ для оценки скилов – подойдет такой уровень на стажера или нет. На скрин не попало сообщение «Привет», потому что его не было. До отправки файлов мы переписывались, где я пару вопросов задал и попросил прислать самые удачные исходники. Примеры на следующий день были отправлены. Я сам далеко не джентльмен, но элементарные нормы прилучая с незнакомыми людьми нужно соблюдать, хотя бы поздороваться и объяснить, что за махуяр сейчас будет отправлен.

📌 Про то, что свой код можно было залить на github молчу – тут ок, не страшно. Но все примеры можно было собрать в один архив. А папки внутри него переименовать так, чтобы было понятно их содержимое. Дальше по переписке еще несколько архивов было отправлено, примерно с такими же названиями. Ладно, если отправить и несколькими файлами, то нужна пояснительная записка с расшифровкой: что из кода в каком архиве находится. Но в итоге я получаю 4-5 архивов с непонятным названием и непонятным содержимым. Нужно тратить время, чтобы все это скачать и пролезть по всем архивам, понять, что там пытались сделать и для чего.

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

❗️По-хорошему, после такой переписке можно сразу ставить точку в вопросе отбора кандидата и дальше не общаться. Но если продолжить переписку, то каждое предложение будет разбито на 5-7 разрозненных сообщений, без знаков препинания и всего остального, чему учат в школе на уроках русского языка.
Пожалуйста, включайте голову и посмотрите на себя со стороны. На сколько удобно и приятно бы вам самим было читать и обрабатывать такой поток текста и файлов? Подумайте о собеседнике и поберегите его время.

#Мысли

БАГодельня

12 Dec, 06:36


Массовая вставка в БД

📖 Что может быть лучше запроса к базе данных в цикле? Да, только запись в БД внутри двух, а лучше четырех циклов.
На скрине кусок кода из проекта на фреймворке на Laravel. Тут происходит запись данных к четыре разные таблицы БД. Чтобы не вдаваться в подробности, тут достаточно информации, что в общей сложности будет выполнено чуть больше трехсот запросов к БД на создание новых записей.

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

📌 Чтобы убрать запись в БД из самого последнего цикла, достаточно воспользоваться массовой вставкой данных. Предварительно собрав их в массив. Чтобы было понятней, чуть порежу код.

Исходный код:
foreach ($work->materials as $material) {
$estimateMaterial = new EstimateMaterial();
// [...] тут код наполнениями данными
$estimateMaterial->save(); // запись в БД
}

Исправленный код:
// массив под данные, которые сперва соберем
$estimateMaterials = [];
foreach ($work->materials as $material) {
$estimateMaterial = new EstimateMaterial();
// [...] тут код наполнениями данными
// собираем данные
$estimateMaterials[] = $estimateMaterial->toArray();
}
// массовая вставка в БД. Одним запросом
EstimateMaterial::insert($estimateMaterials);


То есть все, что нужно сделать, это предварительно собрать данные и записать их одним запросом(insert). В коде используется ORM, но в БД уходит вот такой запрос:
INSERT INTO
таблица(список полей)
VALUES
(список значений 1),
...
(список значений N)


#КодРевью

БАГодельня

11 Dec, 06:36


Быстрой поиск долгих sql-запросов в MySql

📖 Частенько нужно найти долгие запросы к базе данных, которые могут вызывать проблемы с производительностью и в целом тормозить работу скриптов или всего проекта. Для этого есть много разных инструментов, в том числе и дебаг-режимы внутри фреймворков или отладчики внутри CMS. Но не всегда они спасают, особенно, когда запросов много или под нагрузкой они себя ведут по-другому. Поэтому иногда приходится проверять запросы отдельно от логики бекенда, непосредственно в самом MySql.

📌 Самый простой вариант, это зайти в сам mysql и посмотреть, какие запросы чаще других висят в списке выполняемых и сколько времени они там находятся.
Для этого нужно подключиться к серверу по ssh. И зайти в mysql:
mysql -u ИМЯ_ПОЛЬЗОВАТЕЛЯ_БД -pПАРОЛЬ ИМЯ_БД


Далее выполнить запрос, который покажет все активные запросы, которые в этот момент выполняются:
SELECT * FROM information_schema.PROCESSLIST WHERE COMMAND != 'Sleep' ORDER BY TIME DESC;


Чтобы руками каждый раз не делать запрос, можно сделать просмотр с автообновлением, например, раз в две секунды:
watch -n 2 "mysql -u ИМЯ_ПОЛЬЗОВАТЕЛЯ_БД -pПАРОЛЬ ИМЯ_БД -e \"SELECT * FROM information_schema.PROCESSLIST WHERE COMMAND != 'Sleep' ORDER BY TIME DESC;\""


📌 Это костыльный, но самый простой и быстрый вариант поиска долгих запросов. А чтобы по-человечески и полноценно профилировать запросы, можно использовать специальные программы, например mytop. Или включить и посмотреть логи mysql, там фиксируются все запросы, а так же время начала и завершения их выполнения.
Логи mysql часто бывают выключены, чтобы их активировать нужно отредактировать конфиг, чаще всего он лежит тут: /etc/mysql/my.cnf. Но бывает и тут /etc/my.cnf или /usr/local/mysql/my.cnf.
Для активации записи логирования запросов, в конфиге нужно включить флаг general_log и указать путь, куда логи будут записываться:
[mysqld]
general_log = ON
general_log_file = /var/log/mysql/query.log

Далее нужно сохранить файл и перезапустить mysql командой:
sudo service mysql restart


#БазаЗнаний

БАГодельня

10 Dec, 06:56


Как дебажить сторонние виджеты

📖 Иногда на сайтах нужно вывести виджеты (js-код или iframe) от сторонних сервисов. Это могут быть рекламные сети, блоки комментарием, вставки видео и тд. Зачастую такие вставки завязаны на отображение только на конкретном домене. То есть на тестовом сайте или на локальном компьютере протестировать отображение блока не удается – домен отличается и виджет не подгружается. Но заливать сразу на рабочий сайт и там в реал-тайме настраивать верстку не всегда хорошее решение. Посещаемость может быть большой и ломать сайт, пока идет отладка, недопустимо.

Есть несколько способов, как произвести отладку и примерку виджета.
Можно создать на рабочем сайте отдельную и закрытую страницу, где будут происходить эксперименты. Но такой вариант требует влезания на живой сервер «руками», что не самый удачный план – можно задеть что-то рабочее.

📌 Но есть и второй вариант, который полностью безопасный. Виджеты работают на фронте и определяют статус своего отображения по домену. Поэтому достаточно подменить сам домен. Такого можно добиться на своем компьютере. Достаточно запустить проект на своем ПК и задать локальному домену точно такое же имя, как и у рабочего сайта. А чтобы запускался локальный веб-сервер, а не удаленный, нужно прописать в настройках локальных хостов(hosts) алис:
127.0.0.1    имя-боевого-домена


Пути к файлу с настройками хостов находится:
– для Windows: windows\system32\drivers\etc\hosts
– для Linux, Unix: /etc/hosts
– для MacOs: /private/etc/hosts

📌 После таких настроек, локально запущенный проект будет доступен по рабочему домену. И уже без всяких опасений можно спокойно заниматься отладкой сторонних виджетов.

#БазаЗнаний

БАГодельня

09 Dec, 06:51


Промежуточные результаты

📖 В заказной разработке, особенно, когда много заказчиков с разными по объему запросами, нужно лавировать между сроками задач на целой куче проектов. Не всегда можно точно спланировать спринт даже на неделю и заниматься задачами только из этого плана. 100% вылезет непредвиденное: что-то сломается, поедут сроки на одном проекте и начнут двигать задачи другого заказчика, упадет сайт или случится что-то еще нестандартное требующее срочного решения. Конечно, есть глобальные планы на недели и месяца, но это примерный план, который корректируется.

Очень много неопределенностей, которые выбивают из колеи. С каждым фактором нужно отдельно разбираться и придумывать, как минимизировать его появление или влияние на общий план задач. И это не конкретный алгоритм, который легко отдебажить, протестить и запустить. Любой процесс, где участвуют люди, отлаживается неделями и месяцами. И в итоге не факт, что принесет желаемый результат или дополнительные трудозатраты и силы окажутся на сколько большими, что лучше отказаться от такого решения.

📌 Несколько лет назад, пришла идея упрощения сбора статусов по долгим задачам, которую быстро внедрили, запилили под нее в таскменеджере блок с логикой и по сей день пользуемся. По сути, это обычные дневные отчеты, но складируем их в специальный раздел задачи и по обговоренному формату: что сделал, где смотреть и какие сложности появились. Это ежедневный ритуал. И все заметки выгружается в отдельный интерфейс с фильтром по статусу «проверено». Можно зайти и быстро изучить ситуацию за день – не трогать, если задача продвигается правильно. А где ушли не в ту степь или есть сложности, быстро среагировать и дать комментарии.

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

#Кейсы

БАГодельня

08 Dec, 06:36


«Дырявый» сайт Renault

📖 Есть у Renault личный кабинет для дилеров. Сайт иностранный, французский. И располагается он на поддомене у renault.com. Какой именно поддомен, лучше не буду писать, мало ли кто прочитает пост. Да и вообще, история вымышленная, а все совпадения являются случайными. И на этом поддомене, есть возможность зарегистрироваться и проверить свой французский автомобиль по VIN. Но простому пользователю из всего возможного списка информации, доступно только год выпуска и еще пару незначительных деталей. Однако, если оформить документы, договора официального представителя и тд, то можно получить расширенный доступ автодилера.

Итого мы имеем сайт с авторизацией и пользователями, у которых есть разные роли: обычный и дилерский. Дилерский – расширеный, по vin-номеру получает полную расшифровку по авто, в том числе и все официальные обращения по ТО или по любым другим неисправностям. Максимальное описание истории обслуживания автомобиля, если это свежий транспорт и первые 2-3 года обслуживается у официалов. По этим заметкам можно проследить всю историю авто. Идеальная информация для тех, кто хочет проверить машину перед покупкой. Но увы, инфа доступна только аккаунту с дилерскими правами.

🎩 Или не только дилерскому аккаунту? В общем, на форумах умельцы нашли лазейку, что если авторизоваться как простой пользователь, то все закрытые разделы прячутся только из меню – ссылок нет. Но сами по себе разделы никак не закрываются. Можно перейти по прямому урлу в дилерский раздел и пользоваться полным набором функций.

📌 Прознав про такую «дыру», написали бота в телеграм, который по vin-у делал подробный отчет для авто. А спустя 3-4 месяца узнали, что лазейку прикрыли и теперь из браузера доступа нет. Но бот продолжал работать. Оказалось, что разработчики в Рено все-таки разобрались как закрыть доступ к страницам, но все еще никак не получается закрыть api, через которые бот дергает данные.

Бот был бесплатный и не следили за ним. В какой-то момент он перестал работать, видимо и api закрыли уже.

#Юмор

БАГодельня

07 Dec, 19:11


Результаты конкурса «бесполезных» алгоритмов #1

📖 Немного выпал из графика – два дня без постов, но завтра уже все встанет на свои места.
И главное событие недели уползло аж на четверг – объявление победителя конкурса(условия были тут).

❗️ В финале сразились Илья(код на C) и Евгений(код на Java), у них получилось полностью довести до ума свой код и запустить его в онлайн-компиляторе. Результаты можно посмотреть тут: пост.
Победителя выбирали общим голосованием и с небольшим отрывом победил Евгений(@EvgenyKurmysa).

🎉 Поздравляем, Евгения!
Приз у нас должен был быть памятный календарь. Но из-за проблем с логистикой в другую страну, договорились на денежный эквивалент)) Хоть с переводом тоже пришлось повозиться, но приз дошел до победителя.

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

❗️ Идеи на второй конкурс собираем до вечера понедельника(11 декабря), далее методом голосования определяем лучшую задумку и стартуем на неделю конкурс. В качестве приза все еще остался календарь от РКС на 2024 год, ну и, конечно, всеобщее уважение.

#Конкурс

БАГодельня

06 Dec, 17:36


Топ публикаций за месяц

📖 Ежемесячная рубрика с 5 самыми популярными постами за месяц.
В подборку попадают публикации за прошлый месяц, по количеству реакция плюс количество пересылок в личные сообщения или группы – за каждое действие по одному баллу.

📌 Топ 5 постов за ноябрь

1️⃣Легкий способ усвоить материал
Рубрика #Мысли

2⃣Откат к старому коммиту
Рубрика #БазаЗнаний

3⃣Как не нужно дебажить
Рубрика #Юмор

4⃣Сравнение скорости работы if…else и switch…case
Рубрика #КодРевью

5⃣Лимиты размера файлов в ботах telegram
Рубрика #Кейсы

#Топ5Месяца

БАГодельня

05 Dec, 06:36


Костыль 99 lvl

📖 Сегодня откопали «золото» в одном стареньком проекте на CMS-ке wordpress, который достался нам на доработку и переделку. Пока рисуется и верстается новый и красивый дизайн, подправляем старую версию.

В одном шаблоне нужно было убрать кусок лишней верстки и рядом с ним еще висел блок со стилями, которые его прячут display:none; Этот скрытый div оборачивал логику выборки данных. В wordpress верстка и логика вперемешку, для него это норма, нет разделения на вьюхи и контроллеры. Так вот, убрав ненужный блок, на сайте начали выводиться не понятные числа, и на каждой странице свои.

📌 Начали разбираться и оказалось, что в логике, обернутой скрытым блоком, происходит выборка ID категорий с помощью функции the_category_ID. Это уже устаревшая функция, но вордпресс старенький. the_category_ID может принимать булево значение, служащее флагом – выводить id или только отдать его как значение. По умолчанию, флаг имеет значение true, из-за чего функция и выводит ID и возвращает его, как значение. Код функции на скрине, чтобы полностью понятно стало, как она работает.

📌 Получается, что прошлые разработчики, вместо того, чтобы залезть в документацию или просто загуглить, для изучения работы функции the_category_ID, просто спрятали вывод с помощью стилей display:none; Это максимально «гениальное» решение. Не понятно, в чем была сложность найти описание, какие параметры принимает the_category_ID, если даже сейчас, для устаревшей функции, на первой строчке гугла есть ссылка на официальную документацию, откуда я и сделал скрин. Скорее всего, просто и не пытались найти решение, а сделали костыль, который первый пришел в голову.

❗️Все мы делаем костыли. Но нужно понимать границы адекватности таких решений. Как конкретно сформулировать допустимые рамки, я не знаю. Если есть идеи или мысли — поделитесь.

#Костыли

БАГодельня

04 Dec, 06:36


Ошибка в модуле RetailCRM для 1С Битрикс

📖 Кейс редкий и мало кому пригодится, но если кто-то столкнется, то информация будет очень полезной. Месяц назад выполняли интеграцию сайта на 1С Битрикс с RetailCRM – это crm для интернет-магазинов, с большими возможностями связывать онлайн и оффлайн магазины, а также имеет хороший функционал для программ лояльности.

📌 У RetailCRM есть много готовых модулей под разные CMS и самописные решения магазинов. Битрикс одна из самых популярных цмсок в России для магазинов, и модуль для его интеграции тоже есть у RetailCRM. Сам модуль установился и настроился без проблем, базовые возможности заработали из коробки, без доработок. Но кроме основного функционала, нужно было немного доработать программу лояльности на сайте. Внесли корректировки, начали тестировать и выловили проблему. Иногда бонусы от программы лояльности начисляются не покупателю, а менеджеру или админу, который обрабатывает заказ с сайта через админку 1С Битрикса.

📌 Сперва подумали, что сами где-то ошиблись и перепутали пользователей. Перепроверили всю доработанную логику, но ошибок не нашли. После дебага модуля интегруции с RetailCRM, удалось найти проблему. Ошибка была в коде официального модуля. При редактировании заказа в админке, бонусы по программе лояльности начисляются активному пользователю, который в данный момент авторизован, а не тому, кто сделал заказ. Но поскольку при работе с заказами через админку менеджер должен быть авторизован, его пользовательский id и становился активным. Баллы лояльности начисляются именно менеджеру, который отредактировал или обновил статус заказа.

❗️Поддержка не очень быстро отвечает у RetailCRM, а проект нужно было уже запускать. Поэтому сами внесли правки в коде модуля. А в официальный репозиторий отправили пулл реквест с пояснениями об ошибке и вариантом решения: наш коммит.
На наш запрос разработчики RetailCRM отреагировали через три недели и подтвердили ошибку, но правка еще не реализована на момент публикации поста.

#БазаЗнаний

БАГодельня

03 Dec, 13:05


Голосование за результаты

По итогам недели есть два результата, которые работают полностью и соответствуют условиям ТЗ. Ниже голосование, выбираем победителя народным голосованием.

📌 Первое решение выполнено на С++ от @Zizibob
Код посмотреть и запустить можно тут: https://onlinegdb.com/jBr15l-NH

📌 Второе решение на Java от @EvgenyKurmysa
Код посмотреть и запустить можно тут: https://onlinegdb.com/ycV0l-6fm

Сервис onlinegdb.com устроил подставу – не умеет подгружать файл из сети, поэтому пришлось еще повозиться с этим. Решение было интересным – ребятам сгенерировали массивы заранее и подгрузили их текстовыми файлами.
Так же вывод в онлайн-консоли сервиса может искажать массив, чтобы корректно все отобразить, нужно покрутить масштаб страницы.

❗️Комментарии по коду и его доработкам приветствуются.

#Конкурс

БАГодельня

03 Dec, 06:41


Сервисные уведомления через бота

📌 Простая, но полезная штука – уведомления от служебных скриптов. Для некоторых задач, выполняемых по расписанию или вызываемыми «руками», но долго выполняющимися в фоне, полезно понимать время старта и завершения. А иногда и расшифровку результата или промежуточных вычислений/обработок нужно знать для понимания, как продвигается выполнение.

Для таких целей у нашего рабочего бота телеграм есть эндпоинт, куда можно отправить несколько параметров: название сайта/сервиса, с которого пришел запрос, текст с пояснением, прикрепить json-файл, если данных много или отправить объект данных, когда их мало.

📌 Это не логи, которые пишутся отдельно. А уведомления с пояснительной информацией. Больше для дебага подходит, чем для мониторинга. Удобно слать такие сводки при отладке и тестовых запусках больших и долгих скриптов, где неудобно ждать результата в консоли или потом искать в логах.

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

😁 И есть еще одна запланированная доработка, которую пока не реализовали, но уже появилась необходимость – блокировать прием сообщений от конкретных IP адресов. У нас один скрипт периодически шлет напоминания о себе, хотя проектом уже давно не занимаемся, а доступов к нему не осталось, чтобы отключить. Команда разработчиков, которым помогали отладить импорт товаров из 1С на сайт, пропали с радаров.

#Кейсы