Задать вопрос
  • Как найти запись на репозиторий в linux?

    Dier_Sergio_Great
    @Dier_Sergio_Great Автор вопроса
    Увлеченный человек
    На самом деле файлы существовали, просто в проводнике с включёной галкой "Показать скрытые файлы", файлы не отображались в списке. Я досих пор не понимаю почему. Но в терминале файлы видны, и я удалил их
    rm /etc/apt/sources.list.d/resilio-sync.listcd
    Ответ написан
    2 комментария
  • Почему при build docker compose не видит файлы?

    Проблема связана с особенностями dind в раннере. Когда используется dind, Docker daemon работает в отдельном контейнере, и относительные пути в volumes ссылаются на файловую систему внутри dind контейнера, а не на рабочую директорию вашего CI job.

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

    # Dockerfile для nginx в отдельной директории nginx
    FROM nginx:latest
    COPY nginx.conf /etc/nginx/nginx.conf
    COPY certs /etc/nginx/certs


    # docker-compose.yml
    services:
      nginx:
        build:
          context: ./nginx
        ports:
          - "80:80"
          - "443:443"
        # volumes убираем для статических файлов
    Ответ написан
    Комментировать
  • Как сделать картинку для отображения в почтовых клиентах?

    @Refguser
    Решения для бизнеса: корп.сайты, ИМ, боты и пр.
    Как сделать картинку универсальной под все почтовые клиенты?

    Никак. Почтовые клиенты и пользователи сами решают что показывать в теле письма (я например клиента всегда настраиваю на "только текст").
    Ответ написан
    Комментировать
  • Как сделать код с отменой запросов и переотправкой более простым?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Асинхронщина - это сложно. Асинхронщина с прерываниями в произвольном месте - сложно вдвойне.
    "Прям красиво" в конечном коде не получится. Но можно сделать более-менее приличную абстракцию или воспользоваться готовой.
    Например можно использовать @tanstack/vue-query - оно предусматривает большинство возможных сценариев. Из минусов - не до конца изжитое наследство react: некоторые вещи с vue можно было бы сделать лаконичней.

    Если хочется своего - абстрагируй во что-то подобное, покрывай тестами и переиспользуй.
    Чтоб не было гонок - проверяй актуальность после каждого await.
    Чтоб не было проблем с индикатором загрузки - следует использовать под капотом не логический, а числовой (абстракцию надо оным) loading++ loading-- loading===0 - если такой "застрянет", значит где-то ошибка в логике.:)
    Скрыть(абстрагировать) передачу AbortSignal в axios можно с помощью интерцептора.

    В общем и целом к сожалению в спеках async(Promise) отмены в красивом виде не предусмотрели.
    Есть пример того как хотелось бы чтоб оно работало - "flow" с использованием генераторов (yield вместо async + обёртки), которое позволяет остановить всё на любом моменте извне, ничего не пробрасывая и не подготавливая. Однако это костыль, требует всяких уродливых обёрток, не очевидного поведения и плоховато дружит с типизацией.
    Я всё порываюсь состряпать какой-нить "DeepCancelablePromise" на магии, и заставить его работать похожим образом, но руки не доходят.:)
    Ответ написан
    Комментировать
  • После переезда на новый хостинг перестал работать сайт?

    Adamos
    @Adamos
    Старый сайт вдруг сломался при переезде с хостинга на свой сервер?
    Скорее всего - настроенный по дефолту php.ini с выключенным short_open_tag.
    Ответ написан
    3 комментария
  • Что за инженерное решение с посылкой ВАЖНЫХ электрических сигналов через корпус устройства?

    @Pb_hard
    Общепринятая практика - минус на корпусе.
    Например в автомобиле, в большинстве радиоприборов корпус, кузов это минус. Масса.
    Ответ написан
    2 комментария
  • Выбор флешки. Всего лишь флешки, настоящей флешки и ничего кроме флешки?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Да просто купить NVME коробочку и в неё SSD (самсунг - топ). Будет вам и скорость и объём. А для старых ПК у вас есть вот эта старая флешка на случай, если коробочка с SSD не будет читаться вашим слишком старым ПК. Так-то по идее даже на старых ПК оно всё должно работать без проблем, т.к. USB же с обратной совместимостью.
    Ответ написан
    Комментировать
  • Как работать с подключениями к БД в долгоживущих приложениях с EntityManager в RoadRunner?

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

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

    1. Надеюсь, у вас уже установлен бандл для работы с Roadrunner

    composer require spiral/roadrunner-bundle

    2. Создаём вот эту вот обёртку над соединением

    <?php
    // src/DBAL/ConnectionWrapper.php
    
    namespace App\DBAL;
    
    use Doctrine\DBAL\Connection;
    use Doctrine\DBAL\Driver;
    use Doctrine\DBAL\Configuration;
    use Doctrine\Common\EventManager;
    
    class ConnectionWrapper extends Connection
    {
        /**
         * @var int
         */
        private $reconnectAttempts = 3;
    
        public function __construct(array $params, Driver $driver, ?Configuration $config = null, ?EventManager $eventManager = null)
        {
            parent::__construct($params, $driver, $config, $eventManager);
        }
    
        public function prepare($sql)
        {
            $this->ping();
            return parent::prepare($sql);
        }
    
        public function executeQuery(string $sql, array $params = [], $types = [], ?QueryCacheProfile $qcp = null)
        {
            $this->ping();
            return parent::executeQuery($sql, $params, $types, $qcp);
        }
    
        public function executeUpdate(string $sql, array $params = [], array $types = [])
        {
            $this->ping();
            return parent::executeUpdate($sql, $params, $types);
        }
    
        public function ping(): bool
        {
            if ($this->isConnected() && $this->getWrappedConnection()->ping()) {
                return true;
            }
    
            $this->close();
    
            for ($i = 0; $i < $this->reconnectAttempts; $i++) {
                try {
                    $this->connect();
                    if ($this->getWrappedConnection()->ping()) {
                        return true;
                    }
                } catch (\Exception $e) {
                    // ещё разок
                }
            }
    
            throw new \RuntimeException("Unable to reconnect to the database.");
        }
    }


    3. Конфигурируем Доктрину, чтобы использовала нашу обёртку.

    # config/packages/doctrine.yaml
    doctrine:
        dbal:
            # обычные настройки
            url: '%env(resolve:DATABASE_URL)%'
            driver: 'pdo_mysql'
            server_version: '8.0'
            charset: utf8mb4
            default_table_options:
                charset: utf8mb4
                collate: utf8mb4_unicode_ci
    
            # наша обёртка
            wrapper_class: App\DBAL\ConnectionWrapper


    4. Что ещё

    • Обязательно очищайте EntityManager вручную после каждого запроса по API, или каждого большого действия, или что там у вас ещё. Иначе доктриновская Identity Map распухнет, и память будет течь как мороженное в пустыне.
    • Не забывайте аккуратно обращаться с транзакциями и всегда их коммитить или откатывать.
    • Продумайте, как лучше всего рестартовать сервис, если реконнект всё-таки не сработает.


    5. Лучше, конечно, сделать всё через воркеры RoadRunner.

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

    composer require spiral/roadrunner-symfony
    composer require spiral/roadrunner-doctrine


    Но идея та же, нужно написать обёртку для Доктрины, плюс использовать воркер RoadRunner. Там будет уже более адекватный connection pool и т.д.
    Ответ написан
    Комментировать
  • Может ли быть причиной такого поведения внешнего диска поломка микросхемы?

    Zettabyte
    @Zettabyte
    Проф. восстановление данных ▪ Вопрос? См. профиль
    Описанный вами изначальный диагноз похож на правду. Если жёсткий диск щёлкает головками и останавливает двигатель (перестаёт крутиться) - это вполне похоже на проблемы с головками или поверхностью пластин.

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

    Указанная вами микросхема это мост SATA - USB. Сложновато судить о причинах её нагрева дистанционно и с учётом исходной информации, но заочно я бы всё-таки поставил на неисправность блока магнитных головок.

    Простая замена платы не поможет, т.к. у вашего диска есть адаптивы - уникальные параметры, которые хранятся в другом чипе (ПЗУ). Без их копирования или перепайки хард работать не будет.

    Кроме того, плата этого диска с распаянным ЮСБ. Это довольно бесполезный вариант, т.к. тот самый греющийся мост зарежет практически все возможности нормально работать с HDD.

    Нужно либо распаивать САТА на ЮСБ-плате, либо адаптировать плату от аналогичной SATA-модели.

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

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

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

    UPD:
    Из другого вашего комментария вижу, что вы пишете об отсутствии видимых запилов на верхнем блине.
    Не совсем понятно как вы об этом узнали, но если вы вскрывали 2.5" HDD дома, то это весьма неудачная затея.
    Цена на работу с высокой вероятностью теперь будет выше, а шансы на успех или процент восстановленных файлов - как повезёт, но легко могут стать ниже.
    Ответ написан
    Комментировать
  • Где в WP прописана возможность (запрет) обновления темы?

    @Refguser
    Решения для бизнеса: корп.сайты, ИМ, боты и пр.
    просто интересно, как и почему?

    Потому что тема не из оф каталога, а ВП ищет в каталоге по слагу. Соответственно у твоей левой темы тот же слаг. что и у темы в каталоге.
    Ответ написан
    2 комментария
  • Как js может управлять службой на хосте?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Из этого никак не выяснить.
    Выяснять надо в серверном коде, смотреть как обрабатываются запросы начиная с index.php
    Ответ написан
  • Как сделать доставку изменений на сервер?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    То, что вам нужно называется "Система доставки и развёртывания" или "CI/CD". Работает следующим образом:
    1. На Git сервере создаётся репозиторий - Github, GitLab и прочие сервисы (есть простые и лёгкие варианты для хостинга на своём сервере)
    2. На сервере в разделе CI/CD настраиваете пайплайн на пуш или пулл-реквест в репозиторий: обычно это запуск скрипта или нескольких в докере
    3. При наступлении данного события сервер запускает пайплайн

    Обычно пайплайн состоит из нескольких шагов:
    1. Сборка
    2. Тестирование
    3. Доставка
    4. Развёртывание

    В зависимости от особенностей проекта число шагов может меняться. Для доставки и развёртывания есть два стандартных метода:
    • CI/CD агент на сервере, который выполняет нужные скрипты в контексте оболочки сервера
    • Скрипт, который подключается к целевому серверу по SSH и через него же передаёт нужные файлы (артефакты - в контексте CI/CD процессов).
    Ответ написан
    Комментировать
  • Почему не раскрывается меню в мобильной версии приложения?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    1) Проверить консоль, все ошибки проанализировать, или, в случае затупа, скинуть сюда ошибки.
    2) Возможно на главной не хватает каких-то скриптов, которые подключаются и работают на других страницах
    3) Как вариант - проверить что висит на кнопке бургера и в код раскрытия добавить логирование в консоль, проверить что блок нажимается хотя бы
    4) Проверить перекрытие блоками, временно добавить всем элементам бордер 1 пх солид блэк, убедиться что ничего не перекрывается
    5) Проверить стили, возможно что там где-то у вас выключено взаимодействие с элементом, например через pointer-events: none; Вижу его в стилях, проверьте его наличие при загрузке на элементе.

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

    Такое обычно происходит, когда запрос кидается в lifecycle-хуках, которые могут сработать много раз (например, updated), либо в watch. И когда у вас что-то ошибочно повторно перерендерится, то может бахнуть второй запрос. Дабл-клик по кнопке, которую вы не выключаете сразу после первого клика также не исключается.

    Насчёт идентификатора вашего ничего не могу сказать, потому что не вижу, где и как вы его генерируете.

    Дебажить, дебажить, и ещё раз дебажить VUE.

    1. Если есть возможность запустить фронтенд на локалке в development environment, установите в браузер плагин Vuejs devtools, и посмотрите поведение компонента, кидающего запросы, может быть там что-то увидите.

    2. Откройте devtools браузера и на вкладке Network и кликните ссылку в колонке Initiator (не знаю, как по-русски, не пользуюсь русским в браузере) у этих повторяющихся запросов. Если будут показаны разные участки кода, значит, где-то еще в коде затерялся такой же запрос.

    3. Самое простое: прямо перед строчкой с вызовом запроса axios (прямо перед запросом, в этой же функции, не где-то вне её, а прямо в предыдущей строчке) напишите банальный console.log("Gotcha!!!!"). Если сообщение в консоли браузера появится дважды, значит, проблема исключительно в логике вашей программы.

    4. Если ваш ID действительно генерируется прямо рядом с вызовом запроса, прямо в той же самой функции (что исключает баг с тем, что в запрос подставляется где-то сохранённый и кэшированный фреймворком ID), и это действительно подлый Chromium повторяет запросы из-за крайне нестабильного коннекта у пользователя, то тогда генерируйте ID не просто рандомом, который всё же может повториться, а сгенерируйте нормальный UUID, вероятность повторения которого ЗНАЧИТЕЛЬНО ниже. При приходе запроса сохраняете этот UUID на короткое время где вам удобнее, и если придёт такой же запрос с таким же UUID, то не обрабатываете его. Этот же UUID вам может помочь и в других аспектах: например, вы можете его использовать как "Correlation ID" данного конкретного запроса. Его можно отражать в логах, передавать в другие сервисы, если у вас их несколько. И тогда вы сможете без проблем отслеживать жизненный цикл каждого конкретного запроса.
    Ответ написан
    6 комментариев
  • Странности с зарядкой ноутбука. Причины?

    Странно, что никто не предположил, что проблема может быть в БП, который не может выдать нужную мощность. Банально высохшие электролиты в БП. Поэтому начинать нужно с проверки БП. А еще было у меня с ноутом Acer, в котором уже дохлый акб был, и заряд на него шел пару минут, после прекращался. И заряжать нужно было передергивая каждый раз штекер питания. Поэтому проблема с акб не исключение.
    Ответ написан
    3 комментария
  • Как сделать редирект на мобильную версию сайта в nginx?

    @maksam07
    Ответ написан
    Комментировать
  • Как реализовать библиотеку классов на JavaScript?

    VoidVolker
    @VoidVolker Куратор тега JavaScript
    Dark side eye. А у нас печеньки! А у вас?
    Правильнее так:

    Type.js
    class Type
    {
        isArray() {}
    }
    
    export default Type

    Dialog.js
    class Dialog 
    {
        show() {}
    }
    
    export default Dialog

    CRM.js
    import Type from './Type.js'
    import Dialog from './Dialog.js'
    
    export { Type, Dialog }

    И далее исходный код скармливается сборщикам типа babel, gulp, rollup и прочим. И вот то, что вы привели - результат работы с кодом этих сборщиков для совместимости со старыми браузерами. Для ноды само собой сборщики не используются - там они не нужны. Простой пример реализации библиотеки для ноды/браузера с использованием сборщиков rollup и babel: @voidvolker/enum.
    Ответ написан
    1 комментарий