• Как максимально перемешать строки?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Каждый IP адрес это 32-битное целое.

    Можно отсортировать по обратному порядку бит в числе – это здорово раскидает соседние адреса.

    Понадобятся три функции:
    function ip2n( $ip ) { // строку ip перевести в целое
    	$ipa = explode('.', $ip);
    	return $ipa[0]<<24 | $ipa[1] << 16 | $ipa[2] << 8 | $ipa[3];
    }
    
    function n2ip( $n ) { // целое перевести в строку ip
    	return implode('.', array(
    		$n >> 24 & 0xFF,
    		$n >> 16 & 0xFF,
    		$n >> 8  & 0xFF,
    		$n & 0xFF
    	));
    }
    
    function bitreverse( $n ) { // развернуть порядок бит в 32-битном целом
    	return bindec( strrev( sprintf( '%032b', $n)));
    }


    Теперь остаётся загрузить ваши ip в массив, и прогнать через ip2n, bitreverse, обычную сортировку целых по возрастанию, bitreverse и n2ip. Пример:
    $ips = array(
    	'192.168.1.15',
    	'192.168.1.16',
    	'192.168.1.17',
    	'95.181.217.91',
    	'95.181.217.96',
    	'95.181.217.97',
    	'91.216.3.90',
    	'91.216.3.91',
    	'91.216.3.99',
    	'5.62.157.78',
    	'5.62.157.84',
    	'5.62.157.87',
    );
    
    $ips = array_map( 'ip2n', $ips);
    $ips = array_map( 'bitreverse', $ips);
    sort( $ips, SORT_NUMERIC);
    $ips = array_map( 'bitreverse', $ips);
    $ips = array_map( 'n2ip', $ips);
    
    print_r($ips);
    /* Array
    (
        [0] => 95.181.217.96
        [1] => 192.168.1.16
        [2] => 5.62.157.84
        [3] => 91.216.3.90
        [4] => 5.62.157.78
        [5] => 95.181.217.97
        [6] => 192.168.1.17
        [7] => 91.216.3.99
        [8] => 95.181.217.91
        [9] => 91.216.3.91
        [10] => 5.62.157.87
        [11] => 192.168.1.15
    ) */
    Ответ написан
    2 комментария
  • Каково решение задачи по комбинаторике?

    У Остапа Бендера в мешке 100 слонов, из которых k разноцветных, и он раздает их m детям по слону в руки (k < m < 100). Сколькими способами может состояться раздача слонов?


    Первого слона можно выбрать 100 способами и отдать m способами.
    Второго выбрать 99 и отдать m – 1 способом.
    N = 100 * m * 99 * (m-1) * ... * (100 - m) * 1
    N = 100! / m! * m! = 100!

    Итого, ответ 100! (100 факториал)

    Но, похоже, я что-то не понял в условии задачи – к чему там разноцветность некоторых слонов?
    Ответ написан
    4 комментария
  • Как понять циклы?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Неплохое описание цикла for на Mozilla Developers Network (на русском).

    Попробую своими словами. Внутри for( ... ) находится три выражения:
    1. начальное состояние
    2. проверяемое условие
    3. действие на каждом цикле

    Для сравнения, в цикле while() из этого зоопарка присутствует только условие.

    Простой пример:
    for( i = 0; i < 2; i = i + 1) {
      console.log( i ); // выводит значение i в консоль
    }

    Один раз в начале выполняется первая часть, «начальное состояние» i = 0.
    Проверяется условие i < 2.
    Всё в порядке? – «ныряем» внутрь. Выполняется console.log() и выводится 0.

    Теперь выполняется третье выражение: i = i + 1.
    Снова проверяется условие i < 2 и если всё ок, снова ныряем.
    Выводится 1.

    Опять выполняется третье выражение i = i + 1, но условие уже не проходит проверку, т.к. i стало равно 2.
    Всё, цикл закончен.

    Такой же цикл с while() выглядел бы так:
    i = 0;
    while( i < 2 ) {
      console.log( i );
      i = i + 1;
    }

    Т.е. for() это просто более компактная запись довольно типичного цикла.
    Ответ написан
    1 комментарий
  • Как сделать автоматическую смену даты js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    var dt = new Date();
    var date = dt.getDate();
    if( date < 15) dt.setDate(1); // до 15-го числа будет 1-е
    else dt.setDate(15); // после 15-го – 15-е
    
    // Display the month, day, and year. getMonth() returns a 0-based number.
    var day = dt.getDate();
    var month = dt.getMonth()+1;
    var year = dt.getFullYear();
    document.write(day + '-' + month + '-' + year);
    Ответ написан
    Комментировать
  • Cron срабатывает в начале каждого часа. Почему?

    */14 означает «каждые 14 минут», вернее, когда остаток от деления минут на 14 равен 0.
    Это 0, 14, 28, 42, 56 минут каждого часа.

    Если хотите, чтобы только раз в час на 14-й минуте выполнялся скрипт, уберите */:
    14 * * * * python3 /home/G/script.py

    Несколько раз в час в определённые минуты – перечислите их:
    14,28,42,56 * * * * python3 /home/G/script.py
    Ответ написан
    7 комментариев
  • Является ли ID от VK персональными данными?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Имхо idне является персональными данными.

    Это указатель на данные вроде ФИО + телефон, которые хранятся не у вас. Если пользователь захочет изменить или скрыть свои персональные данные, он это сделает во ВКонтакте. Поэтому у вас его персональных данных нет.
    Ответ написан
    Комментировать
  • Как Frontend разработчику реализовать Backend для своего проекта?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Взять лёгкий хорошо документированный микро-фреймворк и по примерам построить свой backend.

    Например, на php: Slim или Lumen.
    Ответ написан
    Комментировать
  • Как найти сумму на обратной дагонали двухмерного массива?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    «Обратные диагонали» характерны тем, что сумма координат X и Y в рамках одной диагонали постоянна. Алгоритм:
    1. подготовить массив сумм из (5 * 2 - 1) элемента, заполненный нулями.
    2. пройтись по всем элементам массива. Сложив координаты получаем id диагонали – он же индекс в массиве сумм.
    3. прибавляем текущий элемент к нужной сумме.
    // суммы – где сумма координат X + Y = N, для каждой диагонали N постоянно
    var side = 5,
      sum = Array.apply(null, Array(side * 2 - 1)).map(Number.prototype.valueOf,0),
    	row, col
    ;
    
    for( row = 0; row < side; row++) {
      for( col = 0; col < side; col++) {
    	  sum[row + col] += arr[row][col];
    	}
    }
    
    result.innerHTML += '<pre>' + JSON.stringify(sum) + '</pre>';

    fiddle
    Ответ написан
    1 комментарий
  • Как вывести случайный тэг img?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    // выборка всех под-элементов в блоке:
    var $el = $('#block_id').children();
    
    // какой-то один случайный из них:
    var $random = $el[ Math.floor( Math.random() * $el.length)]; 
    
    // вставить его куда-то ещё
    $("#suda").append( $random);


    fiddle
    Ответ написан
    Комментировать
  • Как обеспечить безопасность хранения ключа API?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Обращаться к файлам на уровень выше обычно можно, и так и делают: папка проекта и в неё подпапка, корень веб сайта:
    /var/www/Project/
      .secret_data.php
      public_html/
        index.php  <-- отсюда подключается "../.secret_data.php"


    И параметры доступа к БД и ключи API стоит хранить в таком месте. Ещё часто их значения подгружают в массив окружения $_ENV и $_SERVER при выполнении, и оттуда берут при необходимости. Грубо пример .secret_data.php:
    $params = array(
      'API_KEY' => '3pyWtP7KYVheJWkftdchJLWhwUcK8Rdw',
      'DB_HOST' => '127.0.0.1',
      'DB_USER' => 'root',
      'DB_PASS' => 'secret',
    );
    $_ENV = array_merge( $_ENV, $params);
    $_SERVER = array_merge( $_SERVER, $params);


    Распространённое решение – использовать пакет vlucas/phpdotenv, который загружает «секретные» данные из файла .env
    Ответ написан
  • Как вывести сумму чисел в промежутке через ф-цию?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    upd. самый лаконичный вариант без переборов:
    function rangeSum(a,b) {return (b*b-a*a+a+b)/2}
    
    console.log( rangeSum( 1, 3)); // 6
    console.log( rangeSum( 20, 220)); // 24120


    (старый ответ) Перебором всех значений подряд:
    function rangeSum( from, to) {
      var i, sum = 0;
      for( i = from; i <= to; i++) {
        sum = sum + i;
      }
      return sum;
    }
    
    console.log( rangeSum( 1, 3)); // 6
    console.log( rangeSum( 20, 220)); // 24120


    Но если подумать, сумму можно вычислять без перебора:
    function rangeSum2( from, to) {
      var m = to - from + 1;
      return from * m + ( m * m - m) / 2;
    }
    console.log( rangeSum2( 1, 3)); // 6
    console.log( rangeSum2( 20, 220)); // 24120
    Ответ написан
    1 комментарий
  • Как узнать индекс элемента с большим значением?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    var arr = [ 1, 3, 2, 3, 6, 2 ];
    var maxIndex = arr.indexOf( Math.max.apply(null, arr)); // 4, считается от 0


    1. Math.max() возвращает наибольшее значение из аргументов.
    2. чтобы передать массив вместо списка, используется apply()
    3. получив само наибольшее значение, остаётся найти его индекс в массиве через метод массива indexOf().


    Не очень эффективно, т.к. фактически массив перебирается дважды: в поиске максимума и в поиске индекса. Можно сделать за один проход, запоминая вместе с найденным максимальным значением его позицию:
    var arr = [ 1, 3, 2, 3, 6, 2 ];
    
    function index_max(arr) {
      var i, maxV, maxP;
      for( i = 0; i < arr.length; i++) {
        if( typeof maxV === "undefined" || arr[i] > maxV ) {
          maxV = arr[i];
          maxP = i;
        }
      }
      
      return maxP;
    }
    
    index_max(arr) // 4
    Ответ написан
    1 комментарий
  • Как взять элементы по парам?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Последовательно разбить в пары можно, например, так:
    var data = [{x:0,y:1}, {x:1,y:1}, {x:4,y:1}, {x:5, y:7}]
      , pairs = []
      , i
    ;
    
    for( i = 0; i < data.length; i++) { // перебираем входные элементы
      if( i % 2 === 0) pairs.push([]); // четный – добавляем новую пустую «пару»
      pairs[ pairs.length - 1].push( data[i]); // в последнюю пару добавляем элемент
    }
    
    JSON.stringify( pairs ) // [[{"x":0,"y":1},{"x":1,"y":1}],[{"x":4,"y":1},{"x":5,"y":7}]]


    Если же вы хотите разбить их в пары не по положению в исходном массиве, а в зависимости от расстояния между ними на поле, это совсем другая история. Уточните вопрос.
    Ответ написан
  • [VK API] Как сделать отправку больших сообщений?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    «сделать отправку сообщений VK API через POST» – именно это и есть решение.

    Upd. Примерно так:
    $params = array(
        'user_id'       => $uid,
        'message'       => $long_message,
        'random_id'     => rand(1E9, 9E9)
        'access_token'  => $token,
        'v'             => 5.64,
    );
    
    $ch = curl_init( 'https://api.vk.com/method/messages.send');
    
    curl_setopt_array( $ch, array(
        CURLOPT_POST            => TRUE,
        CURLOPT_POSTFIELDS      => $params,
    
        CURLOPT_RETURNTRANSFER  => TRUE,
        CURLOPT_SSL_VERIFYPEER  => FALSE,
        CURLOPT_SSL_VERIFYHOST  => FALSE,
        CURLOPT_CONNECTTIMEOUT  => 10,
        CURLOPT_TIMEOUT         => 10,
    ));
    
    $result = curl_exec( $ch);
    
    $data = json_decode( $result);
    
    $message_id = $data['response'];
    Ответ написан
    1 комментарий
  • Как заставить сосчитать значение выражения?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    eval() – но это крайне небезопасно, т.к. исполняется любой код.

    Хотя бы проверяйте перед eval(), что в строке только цифры и -, +, *, /. Если есть что-то ещё – не выполняйте.
    Ответ написан
  • Как загрузить и обрезать фото?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Для начала:
    1. смотрите эту строчку: if (@imagejpeg($virtual_image, $path2, 90)) { – квадратная картинка должна сохраниться в путь $path2, но его значение нигде не определено;
    2. функция createThumb() объявлена, но нигде не вызывается;
    Ответ написан
  • Циклы, Вынести переменную или объявлять внутри при каждой итераиции?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    var, где бы вы его ни написали, «поднимается» наверх при интерпретации кода – это называется var hoisting. Поэтому ваши варианты 1) и 2) не имеют разницы. Возможно, во 2-м варианте вы имели в виду let вместо var?

    Проверять перформанс можете и сами console.time(), и приглашать других на jsPerf. Тысячи итераций недостаточно, пробуйте миллион, миллиард.
    Ответ написан
    Комментировать
  • Можно ли заблокировать доступ к сайту человеку по его ip?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Имя «ppp109-252-68-14...» говорит о том, что этот адрес из пула динамических IP адресов. Т.е. сегодня этот пользователь, завтра другой с этого же адреса. Таким образом, вряд ли бан по ip имеет смысл.

    Проще вычистить из системы оценок все оценки ниже 3, ведь вас это интересует в конечном итоге? И проставить побольше пятёрок самим себе ) Объективность? Нет, не слышал.
    Ответ написан
    4 комментария
  • Высчитать сколько произошло действий за определённый участок времени?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Задача напоминает построение гистограммы. Весь интервал бьётся на отрезки по 15 минут, и считается, сколько событий «упадёт» в каждое из ведёрок.

    Я бы сделал так. На вход функции передаются данные отсчётов, время начала и время конца.

    Сначала подготовить ответ – объект, где ключи это время начала 15-минуток, а значения пока нули. Будут числа событий, попадающие в эти интервалы.

    Перебирать каждое событие. Брать его время начала. Смотреть, попадает ли вообще в исследуемый диапазон. Высчитывать начало его 15-минутки, округлив деление времени до ближайшего начала 15-минутки в меньшую сторону. Прибавлять 1 нужному «ведёрку».

    /**
     * @param array hits - массив данных об ударах. 
     * @param int start - начало интервала (включён), число миллисекунд с 1 января 1970 UTC
     * @param int finish - конец интервала (исключён), число миллисекунд с 1 января 1970 UTC
     *
     * @return возвращает объект, где ключи – моменты начала 15-минуток, а значения – число событий
     */
    function bins( hits, start, finish) {
    	var i
    		,step = 15 * 60 * 1000 // 15 минут в миллисекундах
    		,bins = {}
    	;
    	
    	// заполнить ячейки нулями
    	i = start;
    	do { bins[i] = 0 } while( i += step < finish);
    	
    	// перебрать все сэмплы
    	for(i = 0; i < hits.length; i++) {
    		hitTime = hits[i].ts; // считаем, что значение времени лежит в свойстве "ts"
    		if( hitTime < start || hitTime >= finish) continue; // вне диапазона
    		binTime = start + Math.floor( (hitTime - start) / step) * step; // в какое ведёрко попадает
    		bins[ binTime]++;
    	}
    	
    	return bins;
    }
    Ответ написан
    1 комментарий