БАГодельня
2.23K subscribers
190 photos
2 videos
128 links
Канал про разработку и безопасность: код, костыли, разбор задач, ревью и размышления.

Вещает руководитель отдела разработки: @ipatove
Download Telegram
Очень интересно, но ничего не понятно

📖 Исходный и отредактированный код можно посмотреть тут: ссылка. В сервисе onlinegdb подсветка кода работает, удобнее смотреть, чем в посте телеграм.

Примечание перед постом.
Этот код можно совсем переделать – вытащить данные в более удобном формате при запросе из БД и доработав связи. Но сейчас хочу подсветить пример именно улучшения читаемости кода.

📌 Исходный код на скрине в верхней части – 6 строк, а отредактированный внизу – 22 строчки. Код стал длиннее почти в 4 раза. Плохо ли то, что код стал больше? Нет. Никто не будет бить по рукам за лишний код или дополнительные функции в файлах. Зато добавляется сразу несколько плюсов:
– Код стал понятнее за счет говорящих имен функций и из-за того, что логика разбита на понятные кусочки
– Каждую отдельную функцию теперь удобно комментировать
– Функции удобнее и понятнее дорабатывать и расширять
– Функции стало проще проверять и тестировать

📌 Кроме дробления кода на функции, в методе getRegulationName условие так же разбито и появилось две дополнительные строки. Вместо того, чтобы пихать длинные и непонятные объекты в условие, значения можно предварительно записать в переменные. И дать им говорящие названия, которые не хуже комментариев могут объяснить логику. Тогда, используя в условии такие переменные, логику становится еще более понятной.

❗️Не страшно добавить десяток лишних строк, если это добавит читаемости коду и в дальнейшем упростит доработку и расширение. Минимализм и краткость – это хорошо, но во всем должна быть мера.

#КодРевью
👍7
Съездили покушать на банкете от «Рейтинг Рунета»

📖 В 2021 году участвовали в конкурсе «Рейтинг Рунета» с одним из сайтов, над которым хорошо потрудились – дизайн, контентные фотки и картинки, тексты, верстка и бекенд. Сайт начали делать и запустили первую версию еще в 2019-м, но по проекту постоянно что-то дорабатывается, улучшается и добавляется. Занимаемся им и по сей день. Но в 2019-м году мы только шагнули на встречу vue.js и это был первый опыт его использования. А чтобы еще интересней было, бекенд тоже сделали на новом тогда для нас языке – node.js.

Поскольку стек был новый, собрали все шишки, которые только можно. «Покряхтели», помучались, но сайт запустили. А на сегодняшний день, попробовав и другие фронтовые фреймворки, остановились именно на vue.js. И полностью ушли от статики, оставив ее только для верстки писем и на проектах, за которыми давно присматриваем и дорабатываем. Но первый шаг к vue.js был сделан именно с тем проектом, что отправляли на «Рейтинг Рунета».

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

Банкет бесплатный – надо ехать. Из Брянска до Москвы 4 часа на поезде, почти рядом по меркам всей страны. Ездили вдвоем, я – предводитель разработчиков и второй Женя – главарь дизайнеров. Приехали в столицу, дотопали до места проведения мероприятия. Все прилично – шведский стол, бесплатный бар, музыка. Походили, на людей посмотрели, себя показали, покушали, выпили. Дождались свою номинацию, забрали диплом, сфоткались, еще покушали и выпили, и поехали домой.

📌 Результат приятный – второе место. Проиграли Levi's, но обошли Shell и еще 25 конкурсантов, среди которых были Магнит, Casio, Калашников. Эх, ушел бы левайс пораньше из РФ, взяли бы золото 😁

❗️Пруфы:
– Рейтинг рунета 2021: смотреть.
– Сайт, с которым участвовали: ссылка.

#Мысли
👍12🔥3🤔1
Велосипед, который заблокировал всех пользователей

📖 Пару недель назад обновили заказчику версию Битрикса для сайта. А то последнее время на эту CMS много атак совершается и частенько стали находить уязвимости. Одну дыру нашли совсем недавно, писал про нее пост: ссылка. Кстати, в посте делал приписку, что обновление CMS спасает от уязвимости – это оказалось не так. Проблема остается, 3 ноября был новый отчет от БДУ ФСТЭК, там подсветили, что обновление не спасает. И идеальным решением будет удалить модуль для работы с лендингами.

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

Причиной такого сбоя стало обновление. Точнее не само обновление, а дурной велосипед в коде, который достался нам по наследству от предыдущей команды разработки. Битрикс на сайте был довольно старый и новая версия внесла корректировок в ядро – основную логику CMS. Одним из таких обновлений оказался способ хеширования паролей. Однако встроенные в Битрикс методы, практически всегда имеют обратную совместимость и таких проблем обычно не бывает. Старая логика не ломается после обновлений. А в этот раз сломалось одна из основных функций.

📌 Странновато и слабо верится, что Битрикс на столько сильно мог изменить ядро. Ребята полезли смотреть код – нашли велосипед, привет от прошлых разработчиков. При авторизации, регистрации и восстановлении пароля использовался самописный код создания и сверки хешей пароля. Этот код на скрине в верхней части. Непонятно для чего было нужно это изобретать, если в Битриксе есть свой уже готовый и совместимый со всеми версиями CMS метод – код в нижней части скрина. Костыль заменили на штатный метод цмски и все сразу заработало.
Честно говоря, было бы просто лень писать и изобретать лишний код. Скорее всего этим занимались те, кто не сталкивался ни разу с этой CMS

#Костыли
👍8
Звезда шерифа

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

📌 Однако из всех шутливых функций, только одна прижилась и уже несколько лет ежедневно используется. В течении дня бот помогает напоминалками с отчетами, комментариями, таймерами к задачам, статусами задач и всем остальным, что связано с задачами. И кроме напоминаний, может поругаться, если что-то сделано не так в таскменеджере. Когда добавляли логику с пингами от бота, при ошибках в работе с задачами, между делом добавили и подсчет проступков в течении дня. А чтобы визуализировать количество «преступлений» взяли механику из игры GTA – начисление звезд.

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

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

#Юмор
😁12🔥4👍1
Конструкция try...catch

📖 Обычно посты на тему код ревью выкладываю в рабочие дни – по будням, поскольку все примеры в таких постах из реальных проектов. Но сегодня, уже заканчивая с задачами и готовясь к выходным, случайно наткнулся на коммит, который не заметил на неделе. Его код на скрине.

Коммитом внесено изменение внутри блока catch. Вместо вывода exception-а с ошибкой, добавлена логика с возвратом данных. Этот код будет работать, но такая реализация не верная. Конструкция try ... catch используется для обработки не очевидных и не предусмотренных ошибок, которые могут случиться при выполнении кода внутри блока try. Когда случается непредвиденная беда, то код не валится и не ломает все последующее выполнение, а «перепрыгивает» в блок catch.

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

❗️Важно понимать, что исключения — это то, чего следует избегать в нормальном ходе выполнения логики. Они должны использоваться для обработки только ошибочных условий, которые другим способом не получается обработать или предусмотреть. То есть это крайние меры, для предотвращения полной поломки. Поэтому нельзя использовать try...catch, как if…else, для ветвления логики.

В идеальном и отлаженном коде, инструкции внутри блока catch никогда не выполнятся, поскольку все возможные проблемы уже предусмотрены и обработаны заранее.

#КодРевью
👍121
Mailer – сервис отладки верстки писем

📖 Кто сталкивался с версткой писем для рассылок или просто для красивых уведомлений по почте от сервисов и сайтов, тот наверняка знает, какой это проблемный процесс. Почтовые программы и браузерные клиенты очень по-разному воспринимают css и даже сами html-теги. К тому же html-структура письма должна быть построена на технологиях 20-летней давности – табличной верстке. Чтобы добиться максимально корректного и кроссплатформенного отображения, нужно забыть про все современные стили и подходы к верстке. Как пример, браузерный клиент gmail до сих пор не понимает media-запросы и для адаптива приходится изворачиваться без них. А приложение Outlook 2015-2018 версий, которые еще часто используются, даже скругления через border-radius не умеет обрабатывать, из-за чего все декоративные уголки блоков нужно делать картинками. Плюс с появлением темной и светлой тем, большинство почтовых программы сами инвертируют цвета и перекрашивают верстку, не предоставляя никаких способов управлять этим.

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

📌 Mailer – это сервис, который работает на хосте. Html и картинки для письма связаны с сервисом через репозиторий и по ftp, через которые можно актуализировать файлы. Полученную верстку, сервис валидирует – проверяет теги и стили на кроссплатформенность и подсвечивает места, где могут быть проблемы и в каких почтовиках. Процесс проверки на втором скрине поста. Валидация работает на базе данных от сервиса caniemail.com.
Кроме проверки стилей, Mailer хранит все нужные данные: ссылки на макеты, задачи и список всех тестовых email-ов, на которых выполняется проверка. Ну и конечно, есть возможность сделать тестовую рассылку.

#НашиРазработки
👍6
БАГодельня
Конкурс на самый интересный алгоритм 📖 Появилась идея устраивать конкурсы/соревнования по мотивам предыдущего поста. Сперва коллективно, в течении недели собираем идеи, потом голосуем за самую интересную. И далее неделю пробуем реализовать задумку. В конце…
Конкурс «бесполезных» алгоритмов

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

В общем голосовании приняло участие довольно много людей, даже не ожидал столько – 122 человека. И только 7% ответили, что будет не интересно. Поэтому конкурсу быть!

📌 К посту с предложением о проведении конкурса в комментариях подкинули несколько идей для реализации. Я тоже от себя один добавлю. Ниже будет голосование за идею, которую попробуем реализовать и проверить на практике. Голосование продлиться до завтрашнего обеда (14:00 по МСК) – выберем самый интересный вариант и стартанем конкурс. А итоги подведем в следующее воскресенье (3 декабря).

Язык программирования не важен. Можно писать на любом, главное, чтобы была возможность запустить код и посмотреть результат. Идеально подходят онлайн-компиляторы, например, onlinegdb.com.

❗️ Идеи для конкурса:

1. Алгоритм, для выхода из лабиринта с помощью рандомного выбора направления.
Идея @EvgenyKurmysa
Сгенерировать рандомный лабиринт с гарантированным выходом. И с помощью случайного выбора направления, выйти из него. Подсчитать размеры лабиринта, скорость выхода и количество ходов.

2. Сравнить, что быстрее: сортировка массива рандомом или брутфорсом
Идея @Kustovsky
Сгенерировать массив с уникальными целыми числами и отсортировать его от меньшего к меньшему. Сортировать двумя способами: полный рандом и брутфорсов(перебором). Сравнить, какой подход сортировки окажется быстрее

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

4. Сравнить скорость разных способов конкатенации(склейки) строк
Идея от БАГодельни

#Конкурс
🔥61👍1🤮1
Откат к старому коммиту

Иногда нужно откатить код в репозитории на несколько коммитов. Для этого достаточно посмотреть историю командой:
git log

И выбрать хеш нужного коммита. Далее сделать переключение на этот коммит командой:
git checkout хеш


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

📌 Для полного отката версии кода и продолжения разработки со старого коммита, нужно по-другому делать переключение.
Первым делом, смотрим историю и находим хеш нужного коммита с помощью команды
git log

Далее откатываемся к изменениям нужного коммита:
git reset хеш

В этот момент все файлы откатятся и если использовать команду git status, то можно увидеть все измененные, добавленные и удаленные файлы – это различая между последним коммитом и тем, куда происходит переключение. Чтобы принять все изменения, нужно добавить файлы командой:
git add .

И сделать коммит с понятным названием:
git commit -m "откат туда-то"


Готово. Локально репозиторий откатился. Теперь его нужно запушить. Поскольку часть коммитов удалена, в общем репозитории при push-е будет возникать ошибка. Поэтому протолкнуть изменения и переписать историю коммитов можно только «силой» с помощью команды:
git push --f origin имя-ветки


❗️Такие фокусы с force не пройдут в master, основная ветка защищена от подобных пушей. Но если сильно нужно, то в настройках репозитория можно снять защиту. Но в идеале таких ситуаций не должно возникать.

❗️Если на каком-то из клиентов была стянута версия с удаленными коммитами, то нужно стягивать обновленную ветку с помощью команды:
git pull origin имя-ветки --rebase


#БазаЗнаний
👍132👌2
Конкурс «бесполезных» алгоритмов #1

Ставки сделаны, ставок больше нет. Голосование за алгоритм для конкурса завершено – общим голосованием выбрали генерацию картинки с помощью рандома.

Полная генерация такой картинки будет очень долго работать. Поэтому немного подкорректирую вводные:

📌 Условия задачи
1. Нужно написать скрипт, который примет картинку и переведет цвета пикселей в черно-белый формат. Размер картинки не менее 64х64 пикселей
2. Каждый пиксель картинки нужно сохранить в матрицу (двумерный массив)
3. Вывести исходный массив изображения
4. С помощью рандом получить точную копию картинки
5. Пиксели, которые уже были угаданы рандомом, можно оставлять, не менять заново, генерируя только не совпавшие пиксели изображения
6. Процесс генерации нового изображения должен быть в реалтайме, чтобы было видно, как формируется матрица и картинка постепенно проявлялась из шума

Можно использовать любой язык программирования. Но важно, чтобы результат можно было запустить быстро – через онлайн компиляторы, например такой: onlinegdb.com.

❗️ Результаты и промежуточные обсуждения присылайте в комментарии к этому посту или в чат с комментариями: ссылка.

❗️Прием работ до 3 декабря 14:00 по МСК. Далее общим голосованием выберем победителя, который получит приз.

#Конкурс
9👍2
Код ревью экзаменационной работы на максимальный балл

📖 Сегодня не стандартный код ревью. Текст с ошибками не влезает в пост телеграма. Начал писать и остановился, когда два листа вордовских исписал. Но это еще не все – не одолел html и css, чтобы их детально проверить, да и я не верстальщик) Поэтому, если кому-то интересно и есть время, накидайте в комментарии свои замечания – заберу их. Исходники тут: ссылка.

📌 Прислал сегодня один стажер код, как пример работы, чтобы оценить, подойдет нам или нет – брать его на работу и попробовать научить или не хватает базовых знаний. И бонусом прислал пояснение, что это одна из его экзаменационных работ в частной платной академии, за которую получил высший балл. Эта оценка пошла в итоговый диплом. Диплом тоже прислал – красивая картинка с пометкой «Отлично», подписью и печатью. Академия очная, у нас в городе располагается. Стало интересно, полез смотреть код. Вылез. Покурил. Полез еще раз. Первая мысль – «Я в передаче «Розыгрыш»?». Сходил на сайт академии: срок обучения 1 год, стоимость 6-7 тыс рублей в месяц.

Код совсем никакой. Пытался найти хоть что-то хорошее, но не получилось. JS-а чуть больше 100 строк, а я комментарием по нему собрал строк на 150. Верстку толком не смотрел, но по html и css тоже много вопросов. Да даже имена картинок для верстки и те не правильные: половину кириллицей, какие-то с пробелами в именах, регистр букв в названиях скачет.

📌 Это очень печальная ситуация. Выпускник академии, потратив год на обучение, заплатив деньги, полностью уверен, что научился основам и готов начать работать. Но ему нужно переучиваться и осваивать самые азы заново, практиковаться и где-то получать фидбек по своему коду.
Сейчас и так с разработчиками тяжеловато, толковых и «горящих» сложно найти. А тут еще и такие «учителя» попадаются, которые учат неправильным азам.

Расстроился совсем, хочу отправить свое ревью в эту школу. Если поможете с комментами по коду, буду признателен, чтобы собрать побольше ошибок.

❗️Текст ревью, которое осилил: ссылка.

#КодРевью
👍10
Правки или доработки?

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

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

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

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

❗️ А ниже опрос, как правильно называть изменения в проекте/задаче, которые не связанны с ошибками, но нужны для улучшения интерфейса или логики. То, что не было запланировано или предусмотрено, однако необходимо сделать. Это «правки» или «доработки»? Или только я так загоняюсь, накручиваю себе лишнего и без разницы, какое слово использовать?

#Мысли
🔥1
Как называть изменения в коде, не связанные с ошибками, но нужные заказчику/менеджеру?
Anonymous Poll
26%
Правки
60%
Доработки
15%
Мне не важно
Брутфорс параметров

📖 На скрине код, который собирает данные для отправки на бекенд.
Пример объекта с данными, который упаковывается:
var queryObject = {
filter: {
tags: {
TAG_TYPES: ['news'],
TAG_THEMES: ['building']
},
years: {
YEAR: ['2023']
}
},
page: '1'
};

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

📌 Чтобы не мудрить с условиями и перебором каждого параметра из фильтра можно использовать готовые функции для перевода объекта в строку с набором get-параметров с помощью encodeURIComponent, которая конвертирует ключи и значения объекта в имя и значение get-параметра.
Пример кода с подобной функцией: посмотреть и запустить.

📌 Но можно еще проще передать этот объект на бекенд. Достаточно сконвертировать его в json и отправить запрос к api. Это совсем одна строка кода:
JSON.stringify(queryObject)


❗️Чтобы не закапываться в коде и не создавать самому себе проблем, можно придерживаться простого правила. Если кажется, что что-то пошло не так или появляются дубли условий/логики, значит точно что-то пошло не так и пришло время пересмотреть подход к реализации.

#КодРевью
👍12
Новая папка (123)

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

📌 На сайте был служебный раздел, куда администратор мог залить большой pdf файл для нарезки на куски. Кусочки режутся по свой хитрой логике, которая не имеет значения в этой истории. Большой pdf состоит из условных 100 листов, которые нарезаются на 20 небольших файлов по 5 листов. При загрузке исходного файла, он сперва сохраняется на сервер, потом обрабатывается. Исходник нужен и хранится на сервере еще долго, а не удаляется после обработки. Для этого файла был необходим конкретный формат имени, который всегда одинаковый и отличался только порядковым номером, чтобы добиться уникальности.

При сохранении исходного файла нужно сперва определить максимальный индекс, чтобы добавить к имени файла префикс «_индекс+1». И вот при генерации нового номера для файла, происходила настоящая магия. Оригинал код или его скрин не получилось найти, на словах объясню, должно быть понятно. Был реализован бесконечный цикл, выходом из которого было условие на отсутствие файла. А на каждой итерации цикла происходила проверка файла с именем «file_индекс.pdf», где «индекс» — это число от 1 и выше, увеличивающееся на единице на каждом шаге цикла.

📌 То есть при каждой новой заливке файла, проверялись все файлы по порядку, пока не попадется тот, которого еще нет. Именно такое имя и использовалось для заливки нового файла. Поскольку оригинал кода потерялся, попробую повторить этот шедевр – код ниже:

$index = 1;
$filePath = '/file_' . $index . '.pdf';
// проверяем существование файла
while (file_exists($filePath)) {
$index ++;
// путь к следующему по номеру файлу
$filePath = 'file_' . $index . '.pdf';
}


#Юмор
😁10👍5
Провальный кейс: сбор базы знаний

📖 Постоянно в разработке встречаются ситуации, когда нужно реализовать не самую стандартную логику, написать не часто используемый алгоритм, выполнить интеграцию с редким сервисом, придумать и подставить «изящный» костыль и тд. Практически не бывает такого, что всю задачу сесть и написать, не залезая в документации или google. Какие-то ситуации случаются чаще, а другие реже. И не всегда можно быстро найти понятное описание в мануале или нагуглить решение.

И чем реже ситуация, тем сложней найти реализацию. А некоторые примеры и вовсе приходится комбинировать из разных источников. Найденное и доработанное решение, можно забыть спустя время. Тогда столкнувшись с подобной проблемой еще раз, весь путь поисков и доработок будет повторен. Хотя во время реализации, будет сопровождать мысль, что такое уже точно делал, но не помню как.

📌 Чтобы второй раз не делать одно и тоже, достаточно сохранить заметку – записать кусок кода и пояснение к нему в виде комментариев или пары предложений словами. Такой фиксации достаточно и второй раз уже не придется ломать голову. К тому же записанным решением могут воспользоваться и коллеги из команды, если все заметки каталогизировать, а при необходимости дополнительно расписывать и приводить к понятной форме.

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

⁉️Можно сделать это обязательным, но такой подход принесет лишнюю нагрузку разработчикам и качество заметок будет сомнительным. Поэтому вопрос к залу – как вы в командах собираете базу знаний и собираете ли вообще?

#Кейсы
👍5
Сервисные уведомления через бота

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

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

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

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

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

#Кейсы
👍82
БАГодельня
Конкурс «бесполезных» алгоритмов #1 Ставки сделаны, ставок больше нет. Голосование за алгоритм для конкурса завершено – общим голосованием выбрали генерацию картинки с помощью рандома. Полная генерация такой картинки будет очень долго работать. Поэтому немного…
This media is not supported in your browser
VIEW IN TELEGRAM
Голосование за результаты

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

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

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

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

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

#Конкурс
🔥7👍1