Задать вопрос
  • Как обработать 2 одновременных запроса со стороннего сервера?

    Охх... Никогда не думал, что столкнусь с race condition в PHP )))
    В других языках такое решают общим хранилищем данных для всех параллельных потоков и использованием мьютекса.

    Мы же можем воспользоваться инструментами Redis, которые сделали специально для решения таких вещей. У Redis есть специальные флаги, позволяющие использовать атомарные операции. Команда SET с параметрами NX и EX.
    • SET key value NX — установить ключ, только если он Not eXists (не существует).

    • SET key value EX seconds — установить ключ с временем жизни (eXpire) в секундах.

    Комбинация этих двух флагов позволяет создать атомарную операцию "захватить блокировку на N секунд".

    handler.php
    <?php
    
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    
    // 1. Создаем уникальный ключ для этого конкретного запроса
    $lockKey = 'request_lock:' . md5(json_encode($_REQUEST));
    
    // 2. Пытаемся захватить ключ на 10 секунд
    // Эта команда атомарная: только один процесс из двух победит.
    $isLockAcquired = $redis->set($lockKey, '1', ['nx', 'ex' => 10]);
    
    if ($isLockAcquired) {
        // КЛЮЧ НАШ! Делаем свою работу
        try {
            // ... обращаемся к стороннему сервису, запускаем worker.php или ваще что угодно ...
            
            // отвечаем клиенту об успехе операции
            http_response_code(200);
            echo json_encode(['status' => 'success']);
    
        } catch(\Throwable $e) {
            // Освобождаем ключ для будущих запросов в случае ошибки, чтобы не ждать 10с для переотправки.
            $redis->del($lockKey);
            // отвечаем клиенту, что произошла ошибка
            http_response_code(500);
            echo json_encode(['status' => 'error']);
        }
    
    } else {
        // КЛЮЧ УЖЕ КЕМ-ТО ЗАНЯТ. Ничего не делаем.
        // Просто отвечаем клиенту, что все ок или что запрос дублируется.
        http_response_code(429); // Too Many Requests
        echo json_encode(['status' => 'error', 'message' => 'Request already in progress']);
        exit;
    }
    Ответ написан
    7 комментариев
  • Можно ли пользоваться двумя аккаунтами в Gitlab одновременно?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    На всякий случай напомню: мы пушим не в аккаунты, а в репозитории. Вы можете отправлять коммиты не только в проекты из своего аккаунта. Главное, чтобы у вас были права на запись — админ репозитория должен добавить вас в проект.

    Поэтому само наличие второго аккаунта GitLab не всегда нужно. Хотя на работе могут выдать отдельный логин — и тогда появляются сложности.

    Возможные варианты:

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

    2. Постоянно перелогиниваться, что неудобно: Git будет путаться в кэше аутентификации.

    3. Разделить протоколы:
    – личные проекты — через HTTPS,
    – рабочие — через SSH.
    Так Git не будет пересекать ключи и пароли.

    4. Использовать трюк с виртуальными хостами (как написал Виктор).
    Git всегда использует один SSH-ключ на один хост, но мы можем создать сколько угодно “виртуальных” хостов и привязать к каждому свой ключ. Git будет думать, что это разные GitLab-сервера.
    Ответ написан
    Комментировать
  • Можно ли пользоваться двумя аккаунтами в Gitlab одновременно?

    Опишу, как это сделать на Маке и Линуксе. Про Винду даже не спрашивайте, уже лет 7 как не помню.

    Для работы с двумя аккаунтами GitLab с одной машины требуется настроить Git для использования разных SSH-ключей. Каждому аккаунту будет соответствовать свой ключ.

    1: Создание отдельных SSH-ключей

    Для каждого аккаунта GitLab необходим уникальный SSH-ключ. Если стандартный ключ (`~/.ssh/id_rsa`) уже существует, его можно оставить для первого аккаунта. Для второго аккаунта создаётся новый.

    В терминале выполняется команда для генерации нового ключа. В ней `"email_второго_аккаунта@example.com"` заменяется на почту, привязанную ко второму аккаунту GitLab. При запросе имени файла нужно указать уникальное имя, чтобы не перезаписать существующие ключи.

    # Имя id_gitlab_work можно заменить на любое другое
    ssh-keygen -t ed25519 -C "email_второго_аккаунта@example.com" -f ~/.ssh/id_gitlab_work


    В результате у нас будет две пары ключей:

    • `~/.ssh/id_rsa` и `id_rsa.pub` (для первого аккаунта)
    • `~/.ssh/id_gitlab_work` и `id_gitlab_work.pub` (для второго)


    2: Добавление SSH-ключей в аккаунты GitLab

    Далее публичные части ключей (`.pub`) добавляются в соответствующие аккаунты GitLab.

    Для первого аккаунта это будет ~/.ssh/id_rsa.pub
    Для второго аккаунта ~/.ssh/id_gitlab_work.pub

    Кликаем на аватарку в gitlab, выбираем "Edit Profile" и в секции "SSH Keys" обоих аккаунтов добавляем соответствующие им публичные ключи

    3: Настройка SSH-клиента

    Чтобы система знала, какой ключ для какого репозитория использовать, настраивается файл конфигурации SSH. В нём создаются псевдонимы для `gitlab.com`.

    1. Нужно открыть или создать файл `~/.ssh/config`.

    Если его нет, создаём:
    touch ~/.ssh/config

    2. Открываем файл, добавляем конфигурацию, которая создаёт два «хоста», `gitlab.com-personal` и `gitlab.com-work`, которые оба ссылаются на `gitlab.com`, но используют разные файлы ключей.

    # Первый аккаунт (например, личный)
    Host gitlab.com-personal
      HostName gitlab.com
      User git
      IdentityFile ~/.ssh/id_rsa
      IdentitiesOnly yes
    
    # Второй аккаунт (например, рабочий)
    Host gitlab.com-work
      HostName gitlab.com
      User git
      IdentityFile ~/.ssh/id_gitlab_work
      IdentitiesOnly yes


    4: Настройка локальных репозиториев

    Теперь необходимо обновить URL-адреса удалённых репозиториев в локальных проектах, чтобы они использовали созданные псевдонимы.

    1. В директории проекта для первого аккаунта выполняется команда для изменения URL.
    Проверить текущий адрес: git remote -v
    Заменить `gitlab.com` на псевдоним gitlab.com-personal:

    git remote set-url origin git@gitlab.com-personal:username/repo.git


    2. В директории проекта для второго аккаунта выполняется аналогичная команда, но с другим псевдонимом:

    git remote set-url origin git@gitlab.com-work:otheruser/other-repo.git


    При клонировании новых репозиториев следует сразу использовать адрес с нужным псевдонимом:

    # Клонирование с первого аккаунта
    git clone git@gitlab.com-personal:username/repo.git
    
    # Клонирование со второго аккаунта
    git clone git@gitlab.com-work:otheruser/other-repo.git


    5: (Рекомендуется) Настройка автора коммитов

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

    В репозитории для первого аккаунта:

    git config user.name "Имя для первого аккаунта"
    git config user.email "email_первого_аккаунта@example.com"


    В репозитории для второго аккаунта:

    git config user.name "Имя для второго аккаунта"
    git config user.email "email_второго_аккаунта@example.com"


    После завершения настройки, при выполнении `git push` из разных директорий, Git будет автоматически использовать соответствующий ключ и данные автора.
    Ответ написан
    1 комментарий
  • Можно ли пользоваться двумя аккаунтами в Gitlab одновременно?

    @Everything_is_bad
    нет, потому что я запрещаю это делать
    Ответ написан
    Комментировать
  • Как восстановить повреждённые из видео?

    takezi
    @takezi
    Intelligent people are full of doubts.
    Что то сомнительно, что видео бы повредились перезаписью данных в этом случае. Возможно r.saver восстанавливает некорректно и есть смысл попробовать другую утилиту для восстановления?
    Ответ написан
    4 комментария
  • Защищенный ТАЙМЕР для ограничения прохождения викторины по времени?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Элементарно же, когда пользователь начинает опрос, сохранять в БД запись, содержащую идентификатор опроса, идентификатор пользователя и время начала опроса.
    Ответ написан
    6 комментариев
  • Парсинг с помощью библиотеки requests для Python. Как указать параметр из API если в нем заключается недопустимое значение с точками?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Дык написано же, что это за параметр:
    Request that only some attributes are returned

    И пример приведён: "name,ip,port"
    А вы там передаёте совсем другое: "185.207.214.232:27200"
    Кроме того, вы не то и не туда отправляете - вот оно и говорит, что лишнее поле. Там выше приведён пример правильного запроса - сначала научитесь отправлять правильный запрос, а потом уже используйте фильтры и опции, которые вам нужны. RTFM.
    Ответ написан
    1 комментарий
  • Windows, как выявить процесс, который запускает определенный exe?

    VoidVolker
    @VoidVolker Куратор тега Windows
    Dark side eye. А у нас печеньки! А у вас?
    Вообще можно проще:
    Process explorer -> "makecab.exe" -> Properties -> Image -> Parent

    Фильтры для мониторинга же создания/остановки процессов:
    Operation - is - Process Create
    Operation - is - Process Exit

    Плюс посмотрите автозапуск через Autoruns.
    Ответ написан
    3 комментария
  • Нужна камера без аккаунта, можете подсказать варианты?

    @Komrus
    CIO в системном интеграторе.
    1) Лучше искать по словам "IP-камера" (по "веб-камере" будут попадаться всяике изделия с USB портом; а надо - с Ethernet)
    2) Убедиться, что поддерживает протокол ONVIF.
    3) Убедиться. что в описании нет слов "работа только с облаком ННН"
    4) Подумать - надо ли именно поворотную. Ибо парочка не-поворотных камер запросто может стоить дешевле.
    5) Подумать - нужны ли детекторы движения и т.п. (дабы начинать запись только по обнаружению движения; или - отправлять алярм)
    6) Нужна ли запись (если нет - только текущую ситуацию можно посмотреть; а начинает хотеться глянуть, что собакен делал пол-часа назад и где он взял то, что сейчас жуёт :)))
    7) Убедиться, что веб-морда камеры работает в современных веб-браузерах и не требует какого-то
    экзотического плагина для просмотра видео.
    Ответ написан
    2 комментария
  • Можно ли перевести Sketch and Toon анимацию из C4D в SVG (canvas) анимацию?

    black1277
    @black1277
    Вольный стрелок
    Специально, такого плагина не встречал но есть 2 возможности:
    1 Сначала, экспортировать сцену из Cinema 4D в After Effects: используй Cineware или экспорт в формате .aec (After Effects Composition). Затем в After Effects — использовать плагин Bodymovin. С его помощью ты можешь экспортировать:
    • JSON-файл для Lottie (но он может быть преобразован в SVG-анимацию).
    • Или использовать Lottie + SVG renderer в браузере (например, на сайте или в мобильном приложении).

    И вторая возможность использовать библиотеку threejs. Нужно будет использовать loader для загрузки в сцену файла формата c4d и затем SVGRenderer для вывода анимации в SVG. Пример того что получится можно увидеть здесь
    Ответ написан
    2 комментария
  • Какой способ эффективнее при объединении двух словарей?

    Lord_of_Rings
    @Lord_of_Rings Куратор тега Python
    Дунадан - северный странник. Злой, но очень добрый
    dict.update() самый быстрый. Про остальные можете тут посмотреть
    Ответ написан
    Комментировать
  • Что изучать дальше?

    Lord_of_Rings
    @Lord_of_Rings Куратор тега Python
    Дунадан - северный странник. Злой, но очень добрый
    Но куда двигаться дальше?
    Пойти устроиться на работу и начать решать практические задачи
    Ответ написан
    Комментировать
  • Как в софтверных компаниях относятся к использованию ИИ?

    @Everything_is_bad
    Но имея базовые понятия, да с помощью ИИ я же могу junior'ом то уже работать
    но вот только джины не сильно и нужны, а тем более такие.

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

    Короче, ИИ способен убирать кучу рутины квалифицированного программиста, но не заменить его. Так же ИИ решает мелкие частные задачи "обычных" людей.
    Ответ написан
    4 комментария
  • Как эту задачу решить по другому?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Очевидно не перебирать все варианты, а решить систему уравнений:
    import numpy as np
    
    A = np.array([[5, 3], [3, 3]])
    B = np.array([46.2, 31.5])
    
    # Решаем систему уравнений
    x, y = np.linalg.solve(A, B)
    print(round(x, 2), round(y, 2))
    Ответ написан
    Комментировать
  • Какой бонус лучше выбрать при броске 20-гранной кости?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Вам надо подсчитать вероятности успеха. Просто с бонусом все элементарно. Если бонус b, то у вас выпадают очки b+1,b+2,b+3...,b+20 с равной вероятностью. Считаете сколько их больше нужного количества очков m и делите на 20: (20-(m-b)+1)/20. Вот вероятность выиграть с этим бонусом.

    Проблема с двумя кубиками. Тут не сумма, а максимум. Если составить таблицу результатов, например для костей с 3 гарнями, то мы получим вот это:

    * 1 2 3
      -----
    1|1 2 3
    2|2 2 3
    3|3 3 3


    Т.е. 1 выпадет в 1 исходе, 2 в - в трех, 3 в 5... Для 20-гранных кубиков будет аналогично. i от 1 до 20 выпадет с вероятностью (2i-1)/400.

    Какие исходы вам подходят? i+b >= m, т.е i >= m-b.
    Итак, для вероятности успеха вам надо проссумировать вероятности всех хороших исходов. Т.е. просуммировать (2i-1)/400 для i от m-b до 20.

    Потом взять ту конфигурацию, у которой вероятность выигрыша больше всего.

    Формулы выше считают, что m > b. Иначе они не совсем работают и там получается вероятность больше 1. На самом деле она там 1. Так что если есть вариант с бонусом хотя бы нужное количество очков - берите его не раздумывая.
    Ответ написан
    Комментировать
  • Почему не нужно менять тип при использовании devServer в webpack.config?

    yarkov
    @yarkov
    Помог ответ? Отметь решением.
    Почему не нужно менять тип при использовании devServer в webpack.config?


    Потому что вот
    Ответ написан
    Комментировать
  • Объединенный буфер обмена у двух пк. Как это возможно?

    @d-stream
    Готовые решения - не подаю, но...
    В общем-то это похоже на штатный режим 10/11:
    Чтобы настроить автоматическую синхронизацию, нужно:
    Выбрать «Пуск» > «Параметры» > «Системный» > «Буфер обмена».
    Установить переключатель «Журнал буфера обмена на всех устройствах» в значение «Вкл.».
    Выбрать «Автоматически синхронизировать текст, который я копирую».
    Функция синхронизации привязана к учётной записи пользователя «Майкрософт» или рабочей учётной записи, поэтому для входа на всех устройствах нужно использовать одни и те же данные.

    https://support.microsoft.com/ru-ru/windows/%D0%B8...
    Ответ написан
    1 комментарий
  • Что лучше использовать для интернет магазина asp net core mvc или web api?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Лучше для чего именно? По каким именно критериям? В целом же - то, что знаете или хотите изучить.
    Ответ написан
    Комментировать
  • Как оптимизировать цикл while?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    def get_number(text:str, limit: int) -> int:
        while True:
            number = int(input(text))
            if number <= limit:
                return number
            print('ВНИМАНИЕ! Превышено. Введите меньшее кол-во.', end="\n")
    
    
    number_maps_1_3 = get_number(f"Введите кол-во для {interval_1}: ", levels_1_3)
    number_maps_4_7 = get_number(f"Введите кол-во для {interval_2}: ", levels_4_7)
    ...

    И разберитесь с неймингом переменных как советуют выше
    Ответ написан
    Комментировать