Задать вопрос
  • Почему токен (токен свежий и активен на сайте) воспринимается как невалидный в API crm "Мой класс"?

    @Everything_is_bad
    Например, ты туда суёшь api_key, а не access-token полученный с помощью api_key, а так, с подобными вопросами надо идти в поддержку этого сервиса.
    Ответ написан
    Комментировать
  • Отечественные нейронки для кодинга и не только сентябрь 2025?

    @rPman
    Отечественные нейронки отстают по уровню качества от мировых лидеров на пару лет и разрыв растет.

    Яндекс по уму лучше чем гигачат (а других и нет), и возможности к программированию даже не заявлены но конечно оно может простые задачи выполнять и читать исходные тексты.
    Ответ написан
    2 комментария
  • Поиск по образцу. Как сделать быстрый поиск вхождения картинок-символов на большом чертеже?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    import cv2
    import numpy as np
    
    # Загрузка изображений:
    dr_image = cv2.imread('original.png')
    
    # Преобразуем в серое:
    gray = cv2.cvtColor(dr_image, cv2.COLOR_BGR2GRAY)
    
    # Бинаризация: черные линии → белые (на чёрном фоне).
    _, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
    
    # Шаблоны:
    template1 = cv2.imread('temp2.png', cv2.IMREAD_GRAYSCALE)  # ёлочка
    template2 = cv2.imread('temp1.png', cv2.IMREAD_GRAYSCALE)  # круг
    
    _, template1 = cv2.threshold(template1, 127, 255, cv2.THRESH_BINARY_INV)
    _, template2 = cv2.threshold(template2, 127, 255, cv2.THRESH_BINARY_INV)
    
    # Параметры:
    threshold1 = 0.7  # для ёлочки
    threshold2 = 0.5  # для круга
    
    # Поиск "ёлочки":
    result1 = cv2.matchTemplate(binary, template1, cv2.TM_CCOEFF_NORMED)
    loc1 = np.where(result1 >= threshold1)
    
    # Поиск "круга":
    result2 = cv2.matchTemplate(binary, template2, cv2.TM_CCOEFF_NORMED)
    loc2 = np.where(result2 >= threshold2)
    
    # Результат:
    result = dr_image.copy()
    detected_boxes = []
    
    # Обработка "ёлочки":
    for pt in zip(*loc1[::-1]):
        x, y = pt
        w, h = template1.shape[1], template1.shape[0]
        box = (x, y, x + w, y + h)
    
        if not any(np.allclose(box, b, atol=10) for b in detected_boxes):
            detected_boxes.append(box)
            cv2.rectangle(result, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
            cv2.putText(result, "Tree", (pt[0], pt[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
    
    # Обработка "круга":
    for pt in zip(*loc2[::-1]):
        x, y = pt
        w, h = template2.shape[1], template2.shape[0]
        box = (x, y, x + w, y + h)
    
        if not any(np.allclose(box, b, atol=10) for b in detected_boxes):
            detected_boxes.append(box)
            cv2.rectangle(result, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 2)
            cv2.putText(result, "Circle", (pt[0], pt[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)
    
    # Сохраняем результат:
    cv2.imwrite('result_with_labels.png', result)
    print(f"Найдено объектов: {len(detected_boxes)}")
    
    # Показываем:
    cv2.imshow('Detected', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    >>> Найдено объектов: 12

    68cd5e8cccadf938039122.png
    Ответ написан
    3 комментария
  • Как получить из массива все возможные пары элементов?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Рекурсия есть:

    const combinations = (data, size) => size > 1
      ? Array.from(data, n => combinations(data, ~-size).map(m => [ n, ...m ])).flat()
      : Array.from(data, n => [ n ]);

    Рекурсии нет:

    const combinations = (data, size) =>
      Array.from({ length: data.length ** size }, (_, i) =>
        Array.from({ length: size }, (_, j) =>
          data[(i / (data.length ** (size - j - 1)) | 0) % data.length]
        )
      );

    Применяем:

    // ваш случай
    combinations('abcde', 2)
    
    // а вот, например, числа в интервале [0, 9999], представленные в виде массивов цифр
    combinations([...Array(10).keys()], 4)
    
    // или, интервал [0, 31], но в двоичном виде
    combinations([ 0, 1 ], 5)

    UPD. Вынесено из комментариев:

    Выводит также a,a b,b c,c ... Мне это лишнее

    Окей, вот элементы не повторяются:

    const partialPermutation = (data, size) =>
      data.length < size
        ? null
        : (function get(permutation, result) {
            if (permutation.size === size) {
              result.push([...permutation]);
            } else {
              for (const n of data) if (!permutation.has(n)) {
                permutation.add(n);
                get(permutation, result);
                permutation.delete(n);
              }
            }
    
            return result;
          })(new Set, []);
    Ответ написан
    3 комментария
  • Как в JavaScript достать ВСЕ поля ключ-значения из cookie для сайта?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Галочку HttpOnly в последней колонке видите? Она означает, что кука используется только самим браузером в запросах к сайту и принципиально недоступна из JavaScript.
    Если верить документации TamperMonkey, то он умеет извлекать эти куки, но только в beta-версии.
    Note: httpOnly cookies are supported at the BETA versions of Tampermonkey only for now
    Так что попробуйте перейти на бету.
    Ответ написан
    2 комментария
  • Как обработать 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))
    Ответ написан
    Комментировать