Задать вопрос
  • Насколько удобно Docker интегрирован в PhpStorm?

    romash
    @romash
    web-разработчик
    Про xdebug могу сказать, что вы скорее всего что-то не так готовите. Важно понимать, что сам xdebug является по сути клиентом, который отправляет данные дебаг-серверу (в данном случае его поднимает PHPStorm). Исходя из этого можно с уверенностью заявить, что в docker-compose вообще ничего, связанного с дебагом быть не должно (максимум сюда можно отнести проброс папки vendor, если вам нужно в дебаге проходить по подгруженным композером библиотекам).

    Как работает xdebug: вы открываете в браузере страницу, php начинает её обрабатывать, xdebug смотрит в свой конфиг и, если видит инфу для подключения (адрес и порт дебаг-сервера), то подключается к нему, узнаёт о брейкпоинтах и дальше они между собой взаимодействуют, но подключение поднимает php, то есть оно идет из контейнера на хост, никакие порты при этом пробрасывать не нужно, так как из контейнера ваш хост всегда видно.

    Я ставлю в конфиге xdebug.remote_connect_back=on, тогда не нужно указывать xdebug.remote_host и он ищет сервер на ip, с которого открыли страницу. Правда так не подебажишь cli, но ip-шник хоста тоже можно как-то достать, можете погуглить, если очень хочется.

    Допустим, у вас в xdebug.ini написано следующее:
    zend_extension=xdebug.so
    xdebug.remote_enable=on
    xdebug.remote_autostart=on
    xdebug.remote_connect_back=on
    xdebug.remote_port=9999


    Тогда в PHPStorm достаточно:
    Settings > Languages & Frameworks > PHP > Debug
    В разделе Xdebug указать порт 9999 и поставить галку на Can accept external connections.
    В самом низу, в Advanced settings убрать галку с Notify if debug session was finished without being paused

    Settings > Languages & Frameworks > PHP > Servers
    Добавить сервер:
    Name и Host указать из server_name nginx (с другими прокси не настраивал)
    Port тоже из конфига nginx, а не тот, что пробрасывается наружу!
    Эти данные php берет от своей прокси внутри контейнера и передаёт при поднятии сессии дебага, так что, если неправильно указать, Path mapping не заработает.
    Галочка на Use path mappings и поставить в соответствие папке проекта абсолютный путь внутри контейнера

    Также на всякий случай и для сравнения инструкция для VSCode:
    Установить расширение PHP Debug и добавить в конфигурацию дебага следующее
    {
        "name": "Listen for XDebug in Docker",
        "type": "php",
        "request": "launch",
        "port": 9999,
        "pathMappings": {
            "Абсолютный путь к папке проекта в контейнере": "${workspaceRoot}"
        }
    }


    Это дело у меня прекрасно работает и из под винды со старой docker-machine, и "огромным бубном" я бы это не называл...
    Ответ написан
    Комментировать
  • При попытке масштабирования текста, во время ресайза родителя, текст прыгает?

    romash
    @romash
    web-разработчик
    Когда вам нужно, чтобы какая-либо графика в вебе качественно и плавно масштабировалась, её нужно делать векторной, то есть в SVG
    https://jsfiddle.net/k12Lyofu/35/
    Правда в ней нет автопереносов текста, поэтому я добавил элемент svg, указал ему width: 100% в CSS, во viewBox прописал исходные ширину и высоту блока, а внутрь завернул foreignObject, который позволяет в svg вставлять html, указав ему размеры на весь viewBox, и в него вставил ваш div с текстом, благодаря чему появились переносы. Ну и ещё в JS закомментил ваши строки для font-size

    И тут я увидел, что текст всё равно прыгает :D
    И, честно говоря, мне стало страшно, потому что я, кажется, чего-то не понимаю... Ответ оставлю на всякий случай, но он выходит и не ответ вовсе :(
    З.Ы. Стандартными элементами text я тоже пробовал, без встраивания html для переносов — один фиг (https://jsfiddle.net/k12Lyofu/34/)
    Ответ написан
  • Как настроить nginx для docker registry?

    romash
    @romash
    web-разработчик
    С подобным не сталкивался, делал всё по инструкции и всё хорошо работает.
    Два примечания:
    1. Там nginx запускают, как сервис рядом с registry, у меня же на сервере уже стоит nginx и крутятся сайты, так что я запустил один registry, а конфиг для nginx скопировал на хост (естественно с небольшими правками)
    2. Файл авторизации nginx.htpasswd указанным способом мне создать не удалось, но, так как на хосте уже был openssl, воспользовался такой командой для создания хеша: openssl passwd -crypt
    Ответ написан
    Комментировать
  • Cloud DigitalOcean - как добавить на 1 дроплет, 2 и более айпи?

    romash
    @romash
    web-разработчик
    Пока не нашёл никакой инфы по дополнительным IP (ощущение, что их тут нет), но вот один доп ip мне удалось реализовать через Floating IP (Примечение: предназначен он для другого, так что смотрите сами, надо ли оно вам).
    Есть одно неудобство, просто так слушать запросы с этого ip у вас не получится, так как он подключается к серверу через anchor ip, и слушать нужно его.

    Информация по оплате floating ip
    Ответ написан
    Комментировать
  • Подстроить координаты top/left при групповом масштабировании?

    romash
    @romash
    web-разработчик
    У элементов left, top меняются также пропорциоально scaleWidth и scaleHeight, только не полностью, а только разница с left, top ресайзера.
    elementLeft = resizerNewLeft + (elementLeft - resizerSourceLeft) * scaleWidth
    Ответ написан
  • Как запустить скрипт в VSC?

    romash
    @romash
    web-разработчик
    Чтобы запустить скрипт в терминале, вам нужен интерпретатор. Для js это NodeJS.
    После установки нужно будет перезагрузить VSC, чтобы она его увидела. Чтобы убедиться в том, что интерпретатор установлен и доступен, вбейте в терминале
    node -v
    эта команда выведет версию установленного NodeJS.
    Чтобы запустить скрипт lesson.js достаточно написать в терминале
    node lesson.js
    или даже
    node lesson

    Правда, учитывая то, что у вас VSC, может быть удобнее воспользоваться ей, чем терминалом (NodeJS всё равно нужно установить):
    Для начала у вас должна быть папка проекта, а не просто файл открытый в VSC (создайте папку, положите туда свои скрипты, которые хотите запускать, в VSC Файл -> Открыть папку и выбирайте созданную папку).
    На левой панели есть кнопка с изображением жука, которая открывает панель отладки. В этой панели сверху у вас будет написано "Нет конфигурации". Вам нужно нажать на шестерёнку рядом, если появится выбор, выбрать Node. Будет создан файл конфигурации отладки, после чего сможете смело открывать свои скрипты, ставить точки останова, нажимать в панели отладки зелёную стрелочку и радоваться.
    Ответ написан
    Комментировать
  • Как запустить docker-контейнер со статикой сайта?

    romash
    @romash Автор вопроса
    web-разработчик
    Ответ оказался гораздо проще и красивее, чем я предполагал.
    У докера с версии 17.05 появилась такая замечательная штука, как Multi-stage build. Она позволяет в одном докерфайле сначала сделать контейнер с nodejs, сбилдить в нём статику, а потом создать ещё один контейнер с nginx, в который скопировать артефакты сборки из первого. При этом результирующий образ не будет содержать данных из образа nodejs и исходников (если вы их явно на втором шаге не скопируете), что позволяет сделать его максимально лёгким.
    FROM node:8 as build
    WORKDIR /web
    
    COPY package.json yarn.lock ./
    RUN yarn
    
    COPY . ./
    RUN yarn build
    
    
    FROM nginx:alpine
    WORKDIR /usr/share/nginx/html
    RUN rm -rf *
    COPY --from=build /web/dist .
    Ответ написан
    Комментировать
  • Как правильно обработать строки из бд?

    romash
    @romash
    web-разработчик
    Сделав
    return $this->connection->query("SELECT * FROM `table`");

    , вы вернули из метода getRecords() не массив, а... не уверен, как это называется, но цикл
    foreach ($db->getRecords() as $arr)
    точно работать не будет.
    Можете вместо этого цикла делать как-то так:
    $results = $db->getRecords();
    while ($row = $results->fetch_assoc())
    {
        // Здесь $row - массив с индексами id, name, role
        // Изменяете его и заносите в новую таблицу сразу
    }
    Ответ написан
  • Как определить точку пересечении окружности с определенным радиусом?

    romash
    @romash
    web-разработчик
    Даны точки A (Xa, Ya), B (Xb, Yb), окружность радиуса r с центром в точке B. Найти точку C (Xc, Yc), лежащую на пересечении луча BA с окружностью
    Вектор BA = {Xa - Xb, Ya - Yb};
    Его длинна: |BA| = sqrt((Xa - Xb) ^ 2 + (Ya - Yb) ^ 2);
    Точка C будет найдена, если сместить точку B на вектор BA разделённый на свою длину и умноженный на r:
    Xc = Xb + (Xa - Xb) / |BA| * r,
    Yc = Yb + (Ya - Yb) / |BA| * r
    Ответ написан
  • Как найти блоки?

    romash
    @romash
    web-разработчик
    blocks.push({
        id: /block-(\d+)/.exec(DOMBlocks[i].className)[1] * 1,
        ...
    });

    А вообще для хранения любых данных в верстке лучше использовать data-атрибуты
    <div :class="'block obj-block'" :data-id="block.id">
      </div>

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

    romash
    @romash
    web-разработчик
    x = X + cos(a) * R, y = Y + sin(a) * R, где
    x, y — координаты центра маленькой окружности;
    X, Y — координаты центра большой окружности;
    a — угол;
    R — радиус основной окружности.
    59db434976c9e941294772.jpeg
    Ответ написан
    2 комментария
  • Как спрятать дочерний элемент под родительский?

    romash
    @romash
    web-разработчик
    Тег a у вас уже есть в замыкании:
    (function () {
        document.addEventListener("DOMContentLoaded", function (event) {
    
            var favItems = [].slice.call(document.querySelectorAll(".earn-item__control-item-fav"));
    
            favItems.forEach(function (elem) {
                elem.addEventListener("click", function (event) {
                    console.log(elem);
                });
            });
        });
    }());
    Ответ написан
    Комментировать
  • Подсобите с регулярным выражением?

    romash
    @romash
    web-разработчик
    Ответ не верен, но я слишком долго его писал, так что мне жалко его удалять :D
    Вот так можно получить
    1) AAA(CCC(C1_1);A1_1);
    2) BBB(B1_1; B1_2);
    3) DDD(D1_1).

    Я не уверен, но, насколько мне известно, так как CCC(C1_1) уже находится в найденном (внутри AAA(CCC(C1_1);A1_1)), второй раз его вы не найдёте, для этого придётся повторять парсинг для группы 2 каждого включения.

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

    UPD: Изменил пример. Предыдущая регулярка искала AAA(bar; BBB(); foo) но путалась с AAA(BBB(); foo; DDD(); bar).
    Ответ написан
    4 комментария
  • Как сделать автоскрытие списка select по клику?

    romash
    @romash
    web-разработчик
    Используйте стандартный метод blur() — он снимает фокус с селекта, в следствие чего сворачивается его список
    https://codepen.io/romash1408/pen/bWJqqm
    Ответ написан
    Комментировать