Задать вопрос
  • Как маппить результат запроса бд в структуры со вложенностями Golang?

    - Я считаю, что свой кастомный маппер - это отличное решение. Чтобы быть уверенней, обязательно напишите тесты. Как unit, так и интеграционные, например, с помощью testcontainers.

    - Можете вместо pgx посмотреть в сторону sqlc. У него совершенно другой подход. Вы пишете запрос со всеми джойнами, а он вам автоматически генерирует код со всеми структурами и функциями. Правда, там по джойнам практически отсутствует документация, но уж погуглите.

    - Ну, и если совсем сложно... то... может одним глазком глянуть в сторону ORM? Я никому не расскажу...
    Ответ написан
    5 комментариев
  • Почему не срабатывает ссылка подтверждения регистрации в Symfony 6?

    private VerifyEmailHelperInterface $verifyEmailHelper,


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

    Судя по запятой в конце строчки, свойство $verifyEmailHelper объявляется сразу в конструкторе. А "Constructor property promotion" появился только в версии PHP 8.0

    Поэтому, если версия PHP ниже, появляется подобная ошибка.
    Ответ написан
    1 комментарий
  • Переход с MD5 на SHA256 что нужно сделать чтобы работало)?

    Согласен с обоими ответившими. Дополню, как конкретно я бы сделал.

    Я бы сделал переход более наглядным, чтобы можно было очень быстро посмотреть в каком состоянии на текущий момент наш переход на новую систему.

    Можно, например, для нового хеша завести новое поле в базе с дефолтным null.

    Когда юзер пытается залогиниться своим паролем, смотрим, если в новом поле null, то проверяем аутентификацию по старой схеме, но генерируем новый хэш по новой схеме (password_hash), записываем его в новое поле.
    А если в новом поле уже не null, то, значит, пользователь уже на новой схеме, и продолжаем аутентификацию уже с новым хэшем (password_verify).

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

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

    Да, и не удаляя сразу данные из старого поля, мы всегда сохраняем возможность вернуться на старую схему, если вдруг обнаружили какую-то дыру в безопасности нашего нового метода.
    Ответ написан
  • Как добавить php5.6 в ubuntu 16.04.07?

    Зачем все эти мучения в 2024 году, когда можно один раз разобраться в том, что такое Docker, и навсегда забыть о подобной головной боли...

    https://hub.docker.com/layers/library/php/5.6-apac...
    Ответ написан
    2 комментария
  • Как устранить утечку памяти при множественных соединениях в net/http Golang?

    Скорей всего, проблема в том, что вы возвращаете ошибку, не закрывая http соединение.
    Для этого была специально введена одна из самых привлекательных конструкций языка - defer.

    var client = &http.Client{
        Timeout: time.Millisecond * 100,
    }
    
    func scan(ip string) (error, string, string, string) {
        resp, err := client.Get("http://" + ip)
        // Здесь сразу желательно обработать ошибку ...
        
        // Закрываем соединение в конце выполнения
        // функции в любом случае,
        // даже если где-то возникнет ошибка
        defer resp.Body.Close()
    
        // Закрытие неиспользуемых соединений
        // Нужно ли это теперь?
        // client.CloseIdleConnections()
    
        // Проблема могла быть тут
        // if err != nil {
        //     return err, "", "", ""
        // }
    
        headers := buildHeaders(resp.Header)
        body, _ := io.ReadAll(resp.Body)
    
        // и это нам уже особо не нужно
        // resp.Body.Close()
    
        return err, headers, string(body), resp.Status
    }
    Ответ написан
    3 комментария
  • Как выровнять по высоте заголовки в карточках товаров?

    В карточке элементы flex выравниваем книзу. Однако при помощи "магического" margin-bottom выравниваем изображение и заголовок против основного выравнивания контента, а именно кверху. Таким образом часть элементов карточки льнёт кверху, а часть книзу. Между ними будет свободное место. В результате мы получаем необходимый результат - иллюзию одинаковой высоты заголовков.



    Саму сетку карточек выровняете сами, я не заморачивался, сосредоточившись только на самой карточке
    Ответ написан
    Комментировать
  • Запросы soap в инфоклинику на php?

    Когда я вижу слово SOAP в задаче для PHP, меня инстинктивно передёргивает. Ненавижу и саму идею SOAP, и, особенно, её идиотскую реализацию в PHP.

    Лично для себя нашёл решение: если мне нужно только несколько конкретных запросов от какого-то SOAP сервиса, я просто беру и делаю запросы при помощи curl и чистого XML. И создание XML запроса, и потом парсинг XML ответа, для меня проще, быстрее, приятнее и надёжнее, чем работа с дурацким SoapClient

    Вот вам пример работы с SOAP через curl
    https://stackoverflow.com/questions/7120586/soap-r...

    Т.е. берём программу SoapUI, подключаемся к их апихе, копируем оттуда примеры XML запроса и ответа для наших нужд, и пишем curl запрос по этим шаблонам.

    Кстати, есть инструменты, которые позволяют сгенерировать целый пакет для работы с определенным SOAP API по его wsdl адресу. Там и классы запросов и классы ответов будут сгенерированы, и всё, чтобы делать запросы.
    Можете попробовать, но я недолюбливаю такие инструменты.
    https://github.com/WsdlToPhp/PackageGenerator
    Ответ написан
  • Как добавить отношения "многие-ко-многим" между таблицами из разных баз данных?

    Если вы разделяете проект на микросервисы, но связываете при этом их данные, то вы просто делаете распределённый монолит. А когда вы ещё и базу разрываете на два куска, при этом пытаясь сохранить между ними традиционные связи, как внутри одной базы данных, то вы:
    1. Не решаете абсолютно ни одной из задач микросервисов, т к. сервисы остаются жёстко связанными. Всё можно было бы решить просто при помощи "Clean architecture", DDD и т.д.
    2. Вы добавляете себе невероятное количество головной боли, связанной с самой микросервисной архитектурой, но и плюс все прелести из п.1.
    3. И тогда нафига козе баян?

    - Микросервисы должны иметь полностью независимые базы данных
    - Все взаимодействия должны осуществляться исключительно по API (это мой ответ на ваш вопрос). Как только вы связываете схемы данных, вы теряете весь смысл микросервисов.
    - Вы должны обязательно реализовать распределенные транзакции. Вы должны сами писать код для таких транзакций. А вспомните, как приятно и просто делать транзакции в монолите с одной базой данных.
    - Взаимодействие между микросервисами должно осуществляться на базе строжайших контрактов, которые можно менять только после обсуждения со всеми людьми, разрабатывающими данные микросервисы. Вам неплохо было бы выдумать или позаимствовать какой-то фреймворк, где четко будут описаны общие и частные принципы общения микросервисов.
    - Вы должны обеспечить мониторинг всего и вся, оповещение об отказах и деградации микросервисов
    - Вы должны обеспечить распределенное логирование, чтобы уметь отслеживать даже, например, простые запросы между логами из нескольких независимых систем.
    - И т.д. и т.п.

    Оно вам надо?
    Ответ написан
    Комментировать
  • Как сделать авторизацию по двум таблицам в Symfony?

    Разные категории пользователей в Symfony лучше всего организовать при помощи ролей.

    Основная таблица users будет содержать всех ваших пользователей, это проще всего. Там же и будет поле с ролями.

    Для дополнительных полей другой категории пользователей лучше всего создать отдельную таблицу, которая будет связана с основной через связь one-to-one либо one-to-many по id пользователя (посмотрите уроки по Doctrine).

    Однако, если пользователей с этими дополнительными полями будет подавляющее большинство, то можно не усложнять, а смело создавать эти поля в основной таблице users.

    Очень советую досмотреть полностью уроки с symfonycasts.com. Они великолепны, и там точно всё необходимое должно быть.
    Ответ написан
    2 комментария
  • Как убрать отступ?

    В обычном CSS у нас марджины не ограничиваются границами родителя, они как-бы проникают сквозь его границы. Это очень толковое решение, но не всегда оно нам полезно. Как с этим бороться? Нам надо "обмануть" движок, и дать ему знать, что после последнего дочернего элемента у нас есть ещё какой-то контент, и чтобы марджин нашего последнего дочернего элемента не вылазил наружу, а "спотыкался" об этот невидимый контент.

    Добавляем в начало и в конец родительского блока невидимый контент нулевой высоты при помощи ::after и ::before. При этом идеальным значением свойства display этого невидимого контента будет table, т.к. оно работает именно так, как нам надо, а именно, имеет нулевую высоту по умолчанию.



    Если же, вдруг, вас по каким-то причинам не устраивает этот псевдо-контент внутри блока, то подобного поведения можно добиться при помощи обычного свойства overflow со значением hidden. (Однако при этом мы лишаемся некоторых других возможностей, потому что всё, что находится внутри этого блока, но должно выходить за его границы, будет скрываться.)



    Ну, и на самый крайний случай, если уж и предыдущие два не устроят, то старый добрый float: left; никто не отменял ))))



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

    Ответ написан
    Комментировать
  • Как замаскировать переменную внутри контейнера?

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

    Однако, переменные окружения имеют ряд недостатков. Когда мы храним секреты в переменных окружения, велик шанс того, что программист будет кидать эти секреты в логи, выводить их в поток вывода при сборке/деплое, хранить их в незашифрованном виде где-то в базе и т.д.

    Поэтому, сейчас всё чаще используются специальные сервисы по хранению секретов.
    Я вам рекомендую посмотреть, например, в сторону Hashicorp Vault и его Dynamic Secrets:
    https://www.hashicorp.com/products/vault

    Вот статья об интеграции в Gitlab:
    https://docs.gitlab.com/ee/ci/examples/authenticat...

    Видео о том, что это такое, и как это работает:
    https://youtu.be/VYfl-DpZ5wM?si=SutHlBsLe70qCIVm
    На русском: https://youtu.be/-HIy89Vyobg?si=O4e8AL1SSCm8ImV1
    Ответ написан
    1 комментарий
  • Быстрая загрузка баннера. Как лучше реализовать?

    1. Уменьшайте размер картинок по максимуму, насколько это возможно. Выбирайте форматы, позволяющие хорошо их сжимать. Но, главное тут - не переусердствовать.
    2. Все статические ресурсы лучше хранить в CDN, а не на своём сервере. Они очень быстрые, располагаются по всему миру и выбираются ближе всего к пользователю. Есть у Яндекса, у Cloudflare и т.д.
    https://yandex.cloud/ru/services/cdn

    Ваше решение ускорить загрузку сайта весьма похвально, это сейчас новый тренд. Всех уже достали эти медленные монстры. Многие люди тупо закрывают страницу, когда сайт долго грузится.
    Ответ написан
    Комментировать
  • Переписать грамотнее и с помощью Laravel реально ли и каким лучше образом?

    Шаблонизатор - прекрасная и очень нужная штука для PHP.

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

    Поэтому, совет перейти на Laravel очень разумен. Это неплохой выбор, фреймворк крайне популярен, в него встроено вообще всё, что вам понадобится для написания практически любого проекта.

    Могу дать вам ещё один вариант вместо Laravel. Это Symfony. Да, освоение этого фреймворка будет немного сложнее, чем Laravel, но преимуществом Symfony является то, что он заставляет писать код чище, чем обычно пишут на PHP. Он более строгий, а строгость в программировании всегда к лучшему. Symfony состоит из большого числа компонентов, и собирать проект можно как конструктор. Минимальная его сборка весьма легковесна. Кстати, огромное количество компонентов Symfony используется и в других фреймворках, многие из них можно использовать и без фреймворка.

    Как раз таким компонентом, который можно использовать без фреймворка, т.е. так, как вы хотите, является шаблонизатор Twig. Это превосходный шаблонизатор, его легко внедрять.
    https://twig.symfony.com/

    Но всё же рассмотрите возможность перейти на фреймворк, потому что сейчас в мире PHP почти везде используют именно фреймворки.
    Ответ написан
    9 комментариев
  • Как сделать такую анимацию формы?

    Такие вещи можно решить полностью на CSS.
    Делается скрытый checkbox, его label стилизуется в виде нужной кнопки, а как мы знаем, чекбокс срабатывает даже при клике на его label. И потом при помощи селектора ".toggle:checked + .lbl-toggle + .collapsible-content" запускаем анимацию, когда checkbox устанавливается в значение checked



    P.S. Учите HTML и CSS и вам зачастую не нужно будет использовать Javascript, который последнее время пихают везде: и куда нужно, и куда совершенно противопоказано.
    Ответ написан
    2 комментария
  • Почему автоматически добавляется закрывающий тег?

    Дело в том, что инструменты разработчика оперируют не разметкой, а DOM.

    Как браузер отображает вам страницу?
    Браузер парсит текст HTML, превращая этот текст в программные объекты, которые уже записывает в память, чтобы можно было с этими объектами быстро работать прямо в памяти.
    Структура этих объектов в памяти называется DOM - Document Object Model. Т.е. это программная модель того, что вы там понаписали в HTML-тексте.
    Фактически браузер уже забывает о самом тексте, и работает с этими объектами.
    Так же, браузер знает, с кем он имеет дело, поэтому "старается" по максимуму "исправить" все ваши ошибки в HTML, пытается понять, что вы имели ввиду и хоть что-нибудь вывести на экран.

    А когда вы открываете Инструменты разработчика, то браузер берет эти объекты из памяти и просто отображает их в виде знакомых человеку тегов HTML. Оригинальный текст уже давно забыт. Поэтому все теги в инструментах будут закрыты, все лишние символы пропущены, всё будет красивенько и чистенько.

    Насколько мне известно, поделать с этим ничего нельзя
    Ответ написан
    Комментировать
  • Почему не работает проверка NAN?

    Это JavaScript, детка!
    661a3785d1ef6444222209.png
    661a37a01e49d767748270.jpeg
    661a37d8b28b9965055125.png
    Ответ написан
    Комментировать
  • Подойдет ли базовый MacBook Air M1 8/256 для web разработки?

    Не верьте хайповым видео о том, что его вам хватит для разработки. Сама машинка в плане качества и производительности просто прекрасна. Я являюсь владельцем M1 Pro 16/512. Как раз занимаюсь веб-разработкой.
    - Процессор этот смог бы ещё долго быть конкурентным. Тут проблемы нет.
    - Даже маленький размер диска совсем не проблема, потому что можно купить внешний диск, а т.к. у нас Thunderbolt, то вы практически не будете ощущать недостатка скорости. Внутренний SSD состоит из двух чипов, из-за этого диск работает быстрее, чем на M2 Air, где только один чип.
    - Самая главная проблема, которая хоронит этот компьютер для какой-либо серьезной разработки - это память... 8 Гб никуда не годится. Мне 16 впритык, куда уж там 8. Когда вы откроете браузер, IDE, запустите Docker, запустите автоматическую сборку при изменениях файлов и т.д и т.п., а потом включите Activity Monitor, то вы увидите то, что вам не покажут радостные хайпожоры, расхваливающие этот Мак именно как инструмент разработки. Увидите вы жуткий размер swap и график Memory Pressure жёлтого или красного цвета. Это означает, что памяти уже сильно не хватает.

    Поэтому, брать стоит только 16 Гб или больше. Я бы очень посоветовал не брать ноуты на Windows. Это дрянь. Автономность привязывает вас к розетке, с качеством сборки очень трудно угадать, да я бы не взял винбук из-за одного только Маковского трекпада, который является чуть ли не произведением искусства. На винбуках близко таких нет, даже на самых дорогих.

    В каких случаях можно брать M1 Air 8/256?
    Повторюсь, сам компьютер великолепен. Лучше печатной машинки за эти деньги вы не найдете. Он прекрасен. Если у вас уже есть что-то мощнее, то его можно взять именно как печатную машинку, которую везде таскать с собой.
    Но как только вы выйдете за пределы печатной машинки, нехватка памяти будет вас напрягать. Тем более, нельзя говорить ни о какой перспективе.

    PS. Почитайте каменты к моему посту. Возможно, этот вариант подойдёт.
    Ответ написан
    8 комментариев
  • Возможно ли установить Android Studio на виртуальный сервер?

    Android Studio - это продукт Jetbrains.
    Jetbrains совсем недавно выкатила прекрасный проект, который называется Gateway. Это как раз то, что вам нужно.

    Устанавливаете IDE где-то на мощном удалённом сервере с каким-то Linux десктопом, а на своём калькуляторе открываете приложение Gateway, которое удаленно подключается к той машине и забирает оттуда всё. Вы работаете практически так же, как и на локальной машине.

    Штука пока в бете, постоянно обновляется, и если очень надо, то можно уже работать.

    Однако не уточнял, поддерживается ли конкретно Android Studio. Мои IDE поддерживаются.

    Там, кстати, можно не только к своей машине подключаться, но и к инстансам из Google Cloud, Amazon и т.д.

    Вот ещё интересная ссылка
    https://youtu.be/WOnS994iO7U?si=80OKYBZ_7ji2r4sd
    Ответ написан
    Комментировать
  • Какой актуальный стек верстки 2024?

    Если вы хотите научиться именно хорошо верстать, то углубляйте знания в чистом CSS.
    Изучите все самые современные техники и нововведения CSS, изучайте новые фичи CSS, которые только появились, и у них нет ещё полной поддержки в браузерах. Находите какие-то сложные примеры с CSS-tricks, пытайтесь сначала сами их повторить, а потом сравнивайте с оригинальным решением.

    Так вы будете на острие ножа, и сможете делать то, что обычная публика не умеет, сделаете хорошее портфолио и вас чаще будут брать на интересные и дорогие задачи. А Tailwind, Bootstrap и т.д.... каждая обезьяна может научиться использовать...
    Ответ написан
    2 комментария