• Оптимизировать код или как выделить всю вычислительную мощность пк на его выполнение?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Первое, что бросается в глаза - это многократное копирование массива. Представьте, что при сортировке мы бы после каждых двух-трех перестановок делали бы полный дубликат массива. Это же ужас! И это слабое место, постоянное перевыделение памяти больших размеров.

    Второе, что тоже важно - это сложность O(N*N). В вашем случае это критично, потому что много элементов в исходном массиве.

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

    И маленькая оптимизационная хитрость - поиск интервала происходит по индексу, то есть O(1). Нужно немного поразмыслить, чтобы до этого догадаться, но в целом всё просто.
    Код
    <?php
    $arr = [100,125,75,175,25,300,275,325,375];
    $step = 50;
    
    $b = []; //-1 - deny, 0 - not set, 1 - has interval
    $int = []; //intervals if necessary 
    $step2 = intdiv($step,2);
    $arr = array_values(array_filter($arr, function($v) use ($step2,&$b,&$int) {
        $i = intdiv($v,$step2);
        $mod = $v % $step2;
        $res = true;
        if (isset($b[$i])) {
            if ($b[$i] === -1) $res = false;
            elseif ($mod < $int[$i][0] or $mod > $int[$i][1]) $res = false;
        }
        $b[$i] = -1;
        $b[$i+1] = -1;
        $b[$i-1] = -1;
        if (!isset($b[$i+2])) {
            $b[$i+2] = 1;
            $int[$i+2] = [$mod,$step2];
        } elseif ($b[$i+2] === 1) {
            if ($int[$i+2][0] < $mod) {
                $int[$i+2][0] = $mod;
                if ($int[$i+2][0] >= $int[$i+2][1]) $b[$i+2] = -1;
            }
        }
        if (!isset($b[$i-2])) {
            $b[$i-2] = 1;
            $int[$i-2] = [0,$mod];
        } elseif ($b[$i-2] === 1) {
            if ($int[$i-2][1] > $mod) {
                $int[$i-2][1] = $mod;
                if ($int[$i-2][0] >= $int[$i-2][1]) $b[$i-2] = -1;
            }
        }
        return $res;
    }));
    
    var_dump($arr); // [100, 175, 25, 300, 375]
    ?>

    Переписав алгоритм на С++, получите дополнительно 50-кратное увеличение скорости.
    Ответ написан
    3 комментария
  • Двумерный массив в виде шахматной доски?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    if((Math.floor(i*0.25)+Math.floor(j*0.25))%2 == 0) mas[i][j] +=1;
    Ответ написан
    1 комментарий
  • Как настроить gitlab ci + vds?

    @rionnagel
    ковырятель
    Для этого вам надо установить на vds gitlab-runner, прилинковать его к гитлабу через gitlab-runner register. На gitlab'е уже описывать нужное в yml файле ci/cd.
    Ответ написан
    Комментировать
  • Как правильно выстроить разработку и деплой сайта?

    @marataziat
    Джангист-тракторист
    Сайт нужно засунуть в Kubernetes контейнеры, и когда прилетает на CI сервер оповещение о новом коммите то запустить деплой.

    Надо гуглить laravel kubernetes ci

    Выбери какой ci ты хочешь, например gitlab имеет бесплатный ci и git хостинг или сам создашь свой на gitea с jenkins ci!

    Вариантов куча, но я считаю что от веб серверов в привычном понимании надо отказыватся и все ставить в kubernetes
    Ответ написан
    Комментировать
  • Безопасно ли записывать "секретные" данные в txt-файл с именем из кракозябр (например salkgkawj2145lkjsalfkj@24lkjl), который открыт для чтения?

    @marataziat
    Джангист-тракторист
    Используй uuid в имени файла и отгадать его будет невозможно :) Но это только если ты выключишь directory listing на сервере конечно.

    По такому принципу работают многие CDN! Например если ты посмотришь url превью видео на ютубе то увидешь что юрл очень длинный и непредсказуемый. Даже если это приватное видео то url на превью во вкладке инкогнито будет виден!
    Ответ написан
    Комментировать
  • Есть ли определенный хостинг?

    @marataziat
    Джангист-тракторист
    Это вам не shared hosting с предустановленными php с mysql :) Нужно самим ставить через docker-compose. А деплоить можно на gcp kubernetes тот же или digitalocean docker
    Ответ написан
    Комментировать
  • Как использовать контроль версий для сайта на обычном хостинге?

    @marataziat
    Джангист-тракторист
    Есть много ci/cd сервисов. Например buddy.works там просто нужно указать ваш гит репо и что выгружать при каждом комммите в мастер на ftp сервер.

    Это все бесплатно если деплои непотребляют много ресурсов. Вы вмегда можете поднять Jenkins усебя на raspberry pi или vps.
    Ответ написан
    Комментировать
  • Идентификация пользователя в websocket (vue, express)?

    @kirill-93
    Вебсокеты, как и http - это протокол без состояния. То есть, после перезагрузки страницы, сервер не знает, вы это или нет.
    Поэтому после подключения к вебсокетам, вам нужно отправить на сервер какой-то идентификатор, например свой id.
    На сервере хранить соединения и данные о пользователях. Когда нужно будет отправить сообщение, найдете на сервере нужное соединение и отправите в него данные.

    Вот тут хороший пример простого чата на вебсокетах. Без socketio, но сути это не меняет. Автор сохраняет всех клиентов в массив и работает с этим массивом.
    Ответ написан
    7 комментариев
  • С чего начать изучать алгоритмы?

    @dmshar
    Нужно понять, кем вы стремитесь стать - кодировщиком или разработчиком.
    Если кодировщиком - то выучили язык и бегом - по готовому, кем-то составленному ТЗ - писать программы и деньги зарабатывать.
    Если разработчиком - то без знания алгоритмов вам не обойтись. Вы сами должны будете уметь хотя-бы из имеющихся реализаций выбрать наиболее подходящую или эффективную. А возможно и модифицировать их именно с учетом конкретного приложения. А "рядом" с алгоритмами обычно изучаются структуры данных - без них разработчику (а не кодировщику) - тоже никак.
    Этап изучения языка - это база. Другое дело, что учить "голый" язык бывает скучновато. И это обучение "разбавляют" всякими простенькими задачами -в том числе из области алгоритмизации. Ну, к примеру, поиск максимального элемента в массиве, или простейшие сортировки. Но это не более, чем база. Хотя многие почему-то гордо считают, что это и есть изучение "алгоритмов и структур данных".
    А этап изучения алгоритмов - это уже более высокая ступень совершенствования в профессии.
    Но и изучаются эти две дисциплины по-разному. Изучение языка - это как в школе. Многие вещи надо помнить наизусть. Вы не будете за синтаксисом каждого оператора лазить в Google. Знания языка, умение кодить - это как навык, который должен срабатывать даже во сне. А вот алгоритмы и структуры данных изучаются уже действительно на уровне понимания. Необходимо не запоминать, но понимать, какие они есть, когда они могут оказаться полезными, в чем отличие одного от другого. А при случае - суметь задать умный (!!!) вопрос Google и в море "шлакоответов" найти - и главное понять - правильный.
    Что-до книг. Кормен и Лейзерсон для новичка, действительно, сложноват.
    Но во-первых, есть его "прямая адаптация": Бхаргава А. - Грокаем Алгоритмы. Иллюстрированное пособие для программистов и любопытствущих - 2017. То же самое, но проще.
    Во-вторых, тот же Кормен написал еще одну книгу: Кормен Алгоритмы. Вводный курс. Вот ее можно уже рекомендовать и для новичка.
    Кроме того, могу порекомендовать сайты, с вполне доступными материалами:
    algolist.manual.ru
    aliev.me/runestone
    И в сети - если совсем лень - есть сегодня куча неплохих видеокурсов. Так что - удачи.
    Ответ написан
    Комментировать
  • Как нарисовать дугу между прямыми Canvas?

    @Aves
    В Javascript есть прекрасная функция atan2, позволяющая непринуждённо получать угол, не заморачиваясь определением знака, с помощью неё легко получить параметры для canvas arc.
    пример на JSBin
    Ответ написан
    7 комментариев
  • Как написать условие генерация точек внутри эллипса?

    0xD34F
    @0xD34F
    Сгенерировали одну координату, через уравнение эллипса нашли ограничения для второй, сгенерировали вторую.

    const WIDTH = 300;
    const HEIGHT = 300;
    const canvas = document.getElementById('canvas');
    canvas.width = WIDTH;
    canvas.height = HEIGHT;
    
    const ctx = canvas.getContext('2d');
    
    const
      X = 100,
      Y = 100,
      A = 90,
      B = 50;
    
    const
      N = 1000,
      SIDE = 4,
      HALF_SIDE = SIDE / 2;
    
    const rand = (min, max) => Math.random() * (max - min) + min;
    
    ctx.beginPath();
    ctx.ellipse(X, Y, B, A, Math.PI / 2, 0, 2 * Math.PI);
    ctx.stroke();
    
    for (let i = 0; i < N; i++) {
      const
        x = rand(-A + HALF_SIDE, A - HALF_SIDE),
        maxAbsY = (B - HALF_SIDE) / A * Math.sqrt(A * A - x * x),
        y = rand(-maxAbsY, maxAbsY);
    
      ctx.beginPath();
      ctx.rect(x + X - HALF_SIDE, y + Y - HALF_SIDE, SIDE, SIDE);
      ctx.stroke();
    }

    https://jsfiddle.net/rLcuy4ko/
    Ответ написан
    1 комментарий
  • Как написать функцию пересчета значений одной шкалы в другую?

    LaRN
    @LaRN
    Senior Developer
    Через 3 точки можно провести параболу, тогда не придется работать с диапазонами.
    Посмотрите например интерполяцию Лагранжа.
    https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D...

    Для вашего кейса Y =1250*X*(X+3.8)

    X - Это исходная шкала
    Y - Это новая шкала

    Y(0) = 0
    Y(0.2) = 1000
    Y(1) = 6000
    Ответ написан
    3 комментария
  • Какой язык программирования можно выучить после java и kotlin?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    Уверенно владею основами

    Это типа if-else с циклами городить умеете?
    Для начала просто уверенно освойте хотя бы один язык, до того момента как сможете решать реальные задачи, после этого вопрос "а че дальше" должен отпасть сам.

    P.S. Изначально постановка вопроса типа "Какой язык программирования можно выучить" в корне не верна. Нужно спрашивать "какой яп лучше решает задачу X", но у вас нет никакой задачи, соответственно и ответа нормального вы не получите. Так что учите нормально один язык и не занимайтесь ерундой.
    Ответ написан
    Комментировать
  • Стилизация карты - возможно ли?

    Balya
    @Balya
    Люди и технологии
    Делал вот так:

    $(window).load(function() {
    		$('[class^="ymaps"]').find('[class$="ground-pane"]').css('filter', 'grayscale(100%)');
    	});
    Ответ написан
    Комментировать
  • Как dispatch оказался в props?

    polarlord
    @polarlord
    Потому что в данном примере в connect() не передается mapDispatchToProps() а по-умолчанию его значение это dispatch => ({ dispatch })
    Больше можно почитать в офф. доке https://react-redux.js.org/docs/api#arguments или здесь https://stackoverflow.com/questions/34458261/how-t...
    Ответ написан
    Комментировать
  • Чем лучше и быстрее парсить Amazon на Python?

    @warnerbrowsers
    Вот пример парсинга Amazon на Scrapy, может, пригодится.
    blog.datahut.co/tutorial-how-to-scrape-amazon-usin...
    Ответ написан
    Комментировать
  • Чем лучше и быстрее парсить Amazon на Python?

    polarlord
    @polarlord
    Занимаюсь парсингом Амазона в промышленных масштабах (сотни тысяч страниц в день). Самая большая проблема не в библиотеках, а в том, что Амазон очень умело выявляет попытки парсинга и при этом постоянно совершенствует собственную технику обнаружения таких попыток. Поэтому самый действенный способ - это иметь в своем распоряжении приличный набор качественных прокси (с теми у которых отличается только последняя секция и номер порта долго работать не получится - попадут в черный список на срок от часа до суток, в зависимости от того как интенсивно будете через них слать запросы).
    По поводу библиотек - выбирайте их в соответствии с вашими потребностями, отталкиваясь от объема запросов которые нужно слать. Самые простые - это всякие requests, urllib, pycurl, multycurl. Ими целесообразно пользоваться в однопоточном и синхронном типе парсеров. Но практически всю работу будете писать руками. Если хотите чуть больше мощности и удобства - посмотрите в сторону Grab. Он может многое, в т.ч. удобно работает с прокси и т.д. Если нужен большой объем и скорость - используйте Scrapy. Крутая штука, но со своими правилами. Однако если нужно будет затачивать под себя - в сети много информации по нему.
    С API Амазон можно и нужно работать. Но есть несколько проблем:
    1. Существует лимит на кол-во обращений(тут подробнее, но можно в одном запросе слать до 10-ти ASIN).
    2. Самое неприятное, что по некоторым товарам (при использовании lookup-методов) инфа не приходит либо отличается от оригинала(сайта). Т.е. не нужно полагаться на то, что АПИ будет возвращать информацию полностью идентичную с их сайтом.
    3. Ограничение на кол-во товаров по которым возвращается инфа (при использовании search-методов). 100 товаров. Дальше - только парсинг. Такое ограничение не только у Амазон, у Ebay так же. Без этого - кол-во всяких дропшиперов и прочих посредников просто зашкалило бы.
    Несколько нюансов:
    -Не пытайтесь выдавать себя за Google Bot, ничего хорошего не выйдет, только потратите время.
    -Использование всяких браузерных технологий, наподобие PhantomJS или даже Selenium, толку не принесет. Там к проблеме IP еще добавятся куки и т.п. По скорости будет медленно, для больших объемов не подойдет.
    -Главное, как уже понятно, обойти систему которая определяет ботов и краулеры. Поэтому импровизируйте, экспериментируйте, думайте головой и ищите свои решения. На том конце сидят тоже люди ) В сети масса советов по этому поводу (можете начать с последнего раздела здесь).
    Ответ написан
    5 комментариев