• Как можно улучшить эти функции?

    LaRN
    @LaRN
    Senior Developer
    В первом примере можно немного оптимизировать время работы за счёт меньшего количества вызовов indexof:
    function findAll(str, target) {
      let res = [];
      let ind = 0;
      for(let position = 0; position < str.length; position++) {
         if (ind <= position){
             ind = str.indexOf(target, position);
             if (ind == -1) break;
             res.push(ind);
         }
      }
      return res
    }
    Ответ написан
    2 комментария
  • Python Unittest Как проверить, является ли число Целым и Не отрицательным?

    LaRN
    @LaRN
    Senior Developer
    Извиняюсь за оффтоп, но можно ускорить проверку, если заменить
    for x in range(3, n):
    На
    for x in range(3, round(sqrt(n))):
    Ответ написан
    Комментировать
  • JOIN MySQL с 2 таблицами?

    LaRN
    @LaRN
    Senior Developer
    Тут у третьей таблицы нужно задать уникальный алиас, тогда сработает.
    Например так:

    SELECT to_t.name,  to_t.id, to_t2.name,  to_t2.id
       FROM to_team_games to_t_g 
         LEFT JOIN to_teams to_t   on to_t_g.team_id_1 = to_t.id 
         LEFT JOIN to_teams to_t2 on to_t_g.team_id_2 = to_t2.id 
    WHERE to_t_g.id= 1
    Ответ написан
    Комментировать
  • Как создать учетные записи MySQL из программы Python?

    LaRN
    @LaRN
    Senior Developer
    Можно создать аккаунт для приложения в целом и через этот аккаунт ходить в БД.
    Пользователи работают с приложением (и при этом не имеют напрямую доспупа к БД), контроль прав происходит на уровне приложения, там же происходит добавление новых пользовательских аккаутнов, но это уже не аккаунты БД, а аккаунты приложения.
    Ответ написан
    Комментировать
  • Как избежать одновременного UPDATE таблицы базы данных MySQL?

    LaRN
    @LaRN
    Senior Developer
    Транзакции всем хороши, но под нагрузкой приводят к замедлению работы приложения и иногда, если не правильно работать с запросами к deadlock-м.

    Можно создать отдельную таблицу в которую записывать запросы пользователей на получение ресурса, например так:
    идентификатор пользователя, идентификатор ресурса, статус заявки (в очереди, обработана, отклонена), дата и время заявки с точностью до миллисекунд (ну или числовое поле с автонумерацией).

    При нажатии на "купить товар" операция выполняется в два шага, первый шаг - помещаем заявку пользователя в эту таблицу. (несколько пользователей могут придти за одним ресурсом и приоритет будет у того кто пришел первым)
    Таблица нужна, чтобы не накладывать блокировок на таблицы БД (блокировки могут быть из-за открытой транзакции)

    Далее второй шаг - запускаем процедуру получения статуса заявки (она должна вернуть ответ получил пользователь свой ресурс или нет, т.е. обработана его заявка успешно или отклонена).

    Обработка заявок - это отдельный серверный процесс, он берет заявки по очереди поступления и обрабатывает (изменяет состояние ресурса в БД и состояние заявки) до тех пор пока у выбранного ресурса хватает количества, все пользователи которым не хватило ресурса получают сообщение о невозможности получить ресурс.
    Ответ написан
    3 комментария
  • Как упростить запрос с группировкой, максимальным значением и JOIN в MySQL?

    LaRN
    @LaRN
    Senior Developer
    В подзапросе таблица s_products_discount не нужна, можно вот так попробовать:

    SELECT pd.product_id,
           d.name,
           d.discount_percent,
           d.discount_amount
      FROM s_products_discount pd
      LEFT JOIN s_discounts     d
             ON d.id = pd.discount_id 
      LEFT JOIN (SELECT MAX(d.priority) as max_priority
                   FROM s_discounts dd
                  WHERE dd.id         = pd.discount_id
                    AND dd.visible    = 1
                    AND dd.date_from <= '2018-05-05'
                    AND dd.date_to   >= '2018-05-05') pp 
             ON pp.max_priority = d.priority
     WHERE pd.product_id IN ('41987', '41988', '41989', '41990', '41991', '41992', '41993', '41994')
    Ответ написан
  • Как правильно построить логику для поиска по массивам?

    LaRN
    @LaRN
    Senior Developer
    Если отсортировать по идентификатору, то потом можно просто идти по двум спискам от начала к концу и сверять их по идентификаторам товаров.
    Если в свежем списке есть идентификатор, а в старом нет, то продуктов добавился, если наоборот то удалился. За счёт того что массивы отсортированы сравнение можно выполнить за один проход.
    Ответ написан
    Комментировать
  • Можно ли написать хранимую процедуру для SQL на другом языке (Например С++)?

    LaRN
    @LaRN
    Senior Developer
    В MS SQL можно, вот ссылка на MSDN

    https://docs.microsoft.com/ru-ru/sql/relational-da...

    Расширенные хранимые процедуры

    Библиотеки динамических ссылок (DLL) C или C++, написанные с использованием API-интерфейса служб SQL Server Open Data Services для расширенных хранимых процедур. API-интерфейс служб Open Data Services расширяет возможности хранимых процедур, позволяя им использовать код на C или C++.
    Ответ написан
    Комментировать
  • Почему не совпадает сложность алгоритма?

    LaRN
    @LaRN
    Senior Developer
    Сложность показывает сколько элементарных операций нужно сделать, чтобы решить задачу.
    Если использовать цикл, то сложность будет порядка n операций (по числу итераций цикла), а если взять формулу суммы n первых членов арифметической прогрессии, то сложность будет не O(n*n), а порядка O(1), потому что при любом n по указанной формуле можно вычислить сумму условно за одно умножение.
    Ответ написан
    1 комментарий
  • Как объединить данные в sql join запросе?

    LaRN
    @LaRN
    Senior Developer
    Попробуйте напрямую такой запрос выполнить на базе, будут ли дублирования.

    select pr.id as productId,
    pr.name as productName,
    pr.url as productUrl,
    ct.id as categoryId,
    ct.url as categoryUrl
    ct.name as categoryName
    from products as pr
    inner join categories_products as ctp
    on ctp.product_id = pr.id
    inner join categories as ct
    on ct.id = ctp.category_id

    Возможно в таблице categories_products по product_id есть несколько записей.
    Ответ написан
  • Как правильно взаимодействовать с БД при многопоточности?

    LaRN
    @LaRN
    Senior Developer
    Про суть ошибки написано тут https://habrahabr.ru/post/21326/ или тут www.mysql.ru/docs/man/Commands_out_of_sync.html

    Не ясно как реализован ваш класс доступа к БД. Но если все воркеры идут через один общий коннект, то тогда по ссылкам указано что происходит. По хорошему каждый воркер должен открывать свой коннект к БД.
    Ответ написан
    2 комментария
  • Как вы обходитесь без ORM?

    LaRN
    @LaRN
    Senior Developer
    Если нагрузка на БД не большая и структура БД простая, то ORM подойдёт. Но если много таблиц большого размера(миллионы записей) и требуется строить отчетность, то ORM уже не потянет.
    Нужно руками строить запросы и анализировать план выполнения, чтобы выжать максимум. Обратная сторона - если нужно поддерживать несколько платформ, то писать запросы придётся для каждой платформы с учетом особенностей синтаксиса.
    Ответ написан
    Комментировать
  • Каким должен быть запрос?

    LaRN
    @LaRN
    Senior Developer
    У вас зажимка на список виртуальных чатов и она отсекает общие.
    Можно это условие:
    WHERE c.virtual_id IN ('ind_4_9', 'ind_4_20', 'ind_4_32')
    Изменить как-то так:
    WHERE (c.virtual_id IN ('ind_4_9', 'ind_4_20', 'ind_4_32') or c.type in (all, all_teachers, all_students))
    Ответ написан
  • Как реализовать сложения последовательности бит по модулю 2^32?

    LaRN
    @LaRN
    Senior Developer
    c = (a+b)%4294967296
    Ответ написан
    Комментировать
  • Как можно получить текст между двух символов новой строки?

    LaRN
    @LaRN
    Senior Developer
    Можно без регулярок, например так:

    '\nMonster car\n\n50dol\n\n'.split('\n')[1]

    или так:

    s = '\nMonster car\n\n50dol\n\n'
    l = s.split('\n')
    print(l[1])
    Ответ написан
    Комментировать
  • Как синхронизировать потоки в Java?

    LaRN
    @LaRN
    Senior Developer
    Похожий вопрос разбирали вот тут.
    Чем отличается семафор, мьютекс и монитор? Или это одно и тоже?

    И более подробно здесь
    https://habrahabr.ru/post/277669/
    Ответ написан
    Комментировать
  • Как покрыть полигон прямыми?

    LaRN
    @LaRN
    Senior Developer
    Не нужно рисовать сразу все прямые.
    Нужно найти на указанном контуре две точки, наиболее удаленные друг от друга.
    Далее рисовать линии разметки перпендикулярно линии проведенной через найденные выше две точки.
    Так как точки наиболее удаленные (условно самая длинная хорда), количество линий разметки будет максимальным.

    Для поиска наиболее удаленных точек, можно по координатам точек образующих контур вычислить геометрический центр масс фигуры и затем найти точки контура наиболее удаленные от нет по формуле Евклида.
    Далее для каждой найденной точки строим луч из текущей точки через геометрический центр масс и ищем точку пересечения этого луча с контуром.
    Исходная точка контура и найденная путем трассировки луча образуют отрезок, нужно найти и запомнить длину отрезка.
    После этого имеем массив отрезков с длина, нужно выбрать самый длинный (или один из самых длинных, если есть несколько равных по длине).
    Найденный отрезок и будет проходить через наиболее удаленные точки контура и перпендикулярно ему нужно строить линии разметки.
    Ответ написан
    Комментировать
  • Как найти число которое будет делиться без остатка на все элементы массива?

    LaRN
    @LaRN
    Senior Developer
    Я бы вначале отсортировал массив чисел по возрастанию.

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

    Зачем оставшиеся числа перемножаем (исключая дубли, если они будут).
    (это позволит уменьшить количество чисел и тем самым избежать переполнения типа unsigned long на длинных массивах)

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

    Например: есть число 100500 = 2*2*3*5*5*5*67, тогда словарь будет такой
    {2: 2, 3: 1, 5: 3, 67:1}

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

    LaRN
    @LaRN
    Senior Developer
    Вот тут описание. Полной победы не будет.
    https://learn.javascript.ru/settimeout-setinterval
    Ответ написан
    Комментировать
  • Почему выдает ошибку при использовании find()?

    LaRN
    @LaRN
    Senior Developer
    Похожую ошибку разбирали вот тут:
    https://stackoverflow.com/questions/21129020/how-t...

    Как решение предложили установить кодировку по умолчанию:
    import sys

    reload(sys)
    sys.setdefaultencoding('utf8')
    Ответ написан
    Комментировать