Задать вопрос
  • Как после "10" вызовов function write() в сек, блокировать её на "10мин"?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    На стороне сервера – надо сохранять массив времен последних вызовов функции. При очередном вызове смотреть число времен в этом массиве и время самого раннего. Дописывать в конец текущее время и удалять записи старше 1 секунды.

    В качестве хранилища можно использовать Redis или другое хранилище в памяти.

    Если квота распространяется на каждого юзера в отдельности - хранить для каждого отдельно. В качестве ключа использовать в т.ч. user_id.

    На клиенте похожий принцип: хранить массив времен вызовов и проверять число и время самого раннего при каждом.
    Ответ написан
    Комментировать
  • Что делает этот код php?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Перебирается массив серийников. Путём нехитрых битовых операций сравниваются производные от URL и от последних двух частей в серийнике. Если совпадают, в массив Core::$url дописывается ключ "key" со значением подошедшего ключа.

    Разобрать длинную строку удобнее, разбив конструкцию:
    $d = array('test-site', 'ru');
    $e = array('ST-214E2210-33FE865E-EC05E9A3', 'ST-204C2010-3DEFEFBE-C30E1243', 'ST-214E4000-3D4F3356-E2BCEEBB');
    
    do {
      $b = implode('.', $d); // склеили, получили "test_site.ru"
              
      foreach ($e as $sKey){ // перебираем ключи
        $a = explode('-', $sKey) + array(0, 0, 0, 0); // разбили по дефису в массив,
        // убедились, что в массиве как минимум 4 элемента (если меньше, допис. нулями)
                    
        !( // логическое отрицание того, что в скобках
        	Core::convert64b32( // из 64 бит в 32
        		Core::convert64b32(
        			hexdec($a[3]) // последний фрагмент ключа перевели из 16-ричного в 10-е число
        		) 
        		^  // ксор, побитовое исключающее ИЛИ
        		abs(Core::crc32($b))  // 32-битное число, хэш из адреса сайта
        	) 
        	^  // XOR см. выше
        	~(  // побитовое отрицание
        		Core::convert64b32(
        			Core_Array::get( // тут из конфига получают значение "hostcms" 
        				Core::$config->get('core_hostcms'),
        				'hostcms'
        			)
        		) 
        		&  // побитовое И
        		abs(Core::crc32($b))
        		^
        		Core::convert64b32(
        			hexdec($a[2]) // предпоследний фрагмент из ключа, как число
        		)
        	)
        )
        &&  // только если выше в скобках получился 0, выполнится следующая строка
        Core::$url['key'] = $sKey;
      }
      array_shift($d);
    } while(count($d) > 1);
    
    $a = explode('-', $sKey) + array(0, 0, 0, 0);
    Ответ написан
    Комментировать
  • Как разворачивать и сворачивать (2 и более статей не получается)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Не работает потому, что функцию sh() переопределяете для каждой статьи заново – остаётся последний вариант.

    Лучше сделать так:
    1. Скрываемым частям статей давать класс с display:none У вас это text__podzigilovol.
    2. В ссылке-кнопке для спрятать/показать записывать id управляемой статьи в data-атрибуте: data-id="info-2" – так кнопка будет «знать», кем она управляет.
    3. Кнопкам не писать в href никакого javascript:..., вместо этого лучше на них повесить слушателя события клика. Удобно дать всем кнопкам определённый класс, по нему их отыскать и в цикле повесить слушателя события.
    4. Обработчик клика описывается лишь один раз. Он получает в качестве this кликнутую ссылку. Из неё берёт data-атрибут с id нужного блока. И включает/выключает ему класс, который прячет этот блок.
    Рабочий пример
    Код
    function sh(event) {
      const className = "text__podzigilovol";
      event.preventDefault();
    
      obj = document.getElementById(this.dataset.id);
      if(!obj) return;
      if( obj.classList.contains(className)) {
        obj.classList.remove(className);
      } else {
        obj.classList.add(className);
      } 
    } 
    
    
    Array.prototype.forEach.call(
      document.querySelectorAll('.js-btn-readmore'),
      function(e){
        e.addEventListener('click', sh);
      }
    );
    Ответ написан
    8 комментариев
  • Как составить строку из значений нескольких переменных php?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Выбирайте:
    "$a$b$c";     //  в двойных кавычках подставляются значения (интерполяция)
    $a . $b . $c; // точка - оператор конкатенации
    implode('', [$a, $b, $c]);     // склеиваем массив 
    sprintf('%s%s%s', $a, $b, $c); // "печатаем" по формату и возвращаем результат
    Ответ написан
    Комментировать
  • Как сравнить элементы многомерного массива между собой?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Сортируйте наборы и склеивайте в строку – используйте полученные строки как ключи массива. Значения – массивы ключей исходного.

    Так получите под одним ключем "cloo" два значения ["cool", "looc"], а для остальных по одному.

    spoiler
    <?php
    $data = [
    	"cool" => [0 => "c", 1 => "o", 2 => "o", 3 => "l"],
      "looc" => [0 => "l", 1 => "o", 2 => "o", 3 => "c"],
      "test" => [0 => "t", 1 => "e", 2 => "s", 3 => "t"],
      "set"  => [0 => "s", 1 => "e", 2 => "t"],
      "get"  => [0 => "g", 1 => "e", 2 => "t"]
    ];
    
    $groups = [];
    foreach( $data AS $k => $v) {
    	sort($v);
    	$hash = implode('', $v);
    	if(!isset($groups[$hash])) $groups[$hash] = [];
    	array_push($groups[$hash], $k);
    }
    $result = array_values($groups);
    
    print_r($result);
    /*
    Array(
        [0] => Array
            (
                [0] => cool
                [1] => looc
            )
    
        [1] => Array
            (
                [0] => test
            )
    
        [2] => Array
            (
                [0] => set
            )
    
        [3] => Array
            (
                [0] => get
            )
    )
    */
    Ответ написан
    3 комментария
  • Из строки с "часами", сделать таймер?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    «Закидывайте» и «ловите» не сколько осталось, а время того события, до которого отсчитываете. В виде Unix timestamp'а, целого числа. Так всегда сможете посчитать, сколько осталось.
    Ответ написан
    Комментировать
  • Как заменить элементы одного массива элементами другого по заданному правилу?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Забыли .length – вероятно, собирались перебирать i от 0 до длины строки arr1. Тут не массивы, а две строки.

    for (i=0; i<arr1.length; i++) {
        for (j=0; j<arr2.length; j++){


    Вложенный цикл не нужен. Достаточно перебрать каждую цифру входа.

    Чтобы найти соответствующую цифре i букву, достаточно взять i-й элемент строки arr2:
    arr2[ i ];

    Коротко, в одну строку это можно решить через преобразование строки в массив и применение функции к каждому элементу.
    В одну строку
    var arr1 = '3649824598';
    var arr2 ='АБВГДЕЖЗИК';
    
    arr1.split('').map(n => arr2[n]).join('')  // ГЖДКИВДЕКИ

    • split('') сделает из строки массив цифр;
    • map() применит к каждой цифре функцию, которая заменит цифру на соотв. букву из arr2;
    • join('') склеит элементы массива (теперь уже буквы) в одну строку.
    Ответ написан
    Комментировать
  • Как на самом деле передаются биты по сетевому кабелю?

    Поиск сначала по фразе «витая пара», а затем по «10BASE-T» привёл к вики, где пишут, что
    модуляция сигнала - фазовая. На один бит отводится один период. Смена фазы колебаний означает смену логического состояния от 0 к 1 или наоборот


    Т.е. в проводах «гудит» синусоида с частотой 10МГц и амплитудой +/– 2 Вольта. Фаза иногда меняется. Так, если бы буква "b" передавалась непосредственно как 01100010, это заняло бы 8 периодов, т.е. 8/10000-х секунды, и фаза поменялась бы 4 раза.
    Ответ написан
    Комментировать
  • Как лучше поступить с хранением данных?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Если я буду использовать VK API для получения ID, ФИО и картинки пользователя, то мне надо их хранить у себя в базе, чтобы этот пользователь мог использовать сервис?
    Нет. Храните только ID. Для отображения данных по пользователю запрашивайте картинку и ФИО динамически из интерфейса, прямо из браузера посетителя.

    Смогу ли они найти друг друга через поиск по сайту, если данные, полученные через VK API не хранить на сайте?
    Смотря, по каким признакам искать. По «направлениям деятельности» – смогут. Получат набор id ВК, отобразят их аватарки, ФИО и ссылки на профили.

    Вроде бы всё просто. Заходит чел. на сайт. Жмет кнопку «Войти через ВК». Ваш сервер убеждается, что зашел чел с таким-то id ВК. Создаёте у себя в БД запись с этим id или обновляете дату последнего визита. Выбранные посетителем «направления» сохраняете у себя в БД в таблице id, id-vk, id_naprav (или можно обойтись двумя колонками, без просто-id, объявив primary index двухколоночным).

    Поиск идёт только по интересам: нужны все записи, где id_naprav один из списка. Собрали id_vk, удовлетворяющие критерию. Отдали в интерфейс. Там запросили из ВК по этим id аватарки и ФИО, показали.
    Ответ написан
    1 комментарий
  • Как в Mac OS копировать папки с объединением?

    зажать Option при перетаскивании, в диалоге выбрать вариант Merge
    Ответ написан
    1 комментарий
  • Использование web workers?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Объекты в web worker передаются через сериализацию "structured clone algorithm" и есть ограничения. Нельзя передать функцию и, соотв., логику.

    С другой стороны, можно создавать worker динамически, из data-url, как это описано тут:
    <script type="text/js-worker">
      var myVar = 'Hello World!';
      // остальной код web-worker'а
    </script>
    <!-- ... -->
    <script type="text/javascript">
      var blob = new Blob(Array.prototype.map.call(document.querySelectorAll('script[type=\'text\/js-worker\']'), function (oScript) { return oScript.textContent; }),{type: 'text/javascript'});
    
      // Creating a new document.worker property containing all our "text/js-worker" scripts.
      document.worker = new Worker(window.URL.createObjectURL(blob));

    Полный код примера см. по ссылке выше.

    Т.е. можно хоть в JS на странице сгенерировать код для worker'а и запустить рабочего.
    Ответ написан
    2 комментария
  • Почему не удается сжать видео после оцифровки видеокассеты???

    Скачайте ffmpeg и в командной строке введите что-то типа
    ffmpeg -i "VHS-01.mpg" -c:v libx264 -c:a copy "VHS-01.mp4"
    // VHS-01.mpg – название вашего видео файла.

    Это пережмёт видео кодеком h264, который довольно хорошо уменьшает размер.
    Длинное видео будет пережиматься очень долго – соразмерно трем часам. Поэтому сначала поэкспериментируйте с коротким отрезком длиной минуту – две. Посмотрите, как долго считает. Во сколько уменьшается размер файла.
    Ответ написан
    1 комментарий
  • Messages.getConservations Не работает?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    метод называется иначе: getConversations() ("v" и "s" местами поменять)
    Ответ написан
  • Как узнать, когда иницелизируется функция?

    Promises есть в некоторых языках программирования. "Обещание" того, что страница загрузится. Нужна конструкция как в JavaScript Promise.all([ P1, P2 ]); – после выполнения обоих обещаний можно вызывать функцию.

    // псевдокод
    var docA, docB;
    Pa = asyncload("url-A"); // ф-я возвращает промис
    Pb = asyncload("url-B"); 
    Promise.all([ Pa, Pb ]).then( docA.b_is_ready() );
    // метод объекта docA  "b_is_ready" вызывает функцию в документе B
    Ответ написан
    3 комментария
  • Как отложить выполнение jQuery кода до загрузки библиотеки jQuery?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    <script>
      window.onload = function(){
        // ваш script использующий jQuery
      }
    </script>
    
    ...
    
    <!-- загрузка библиотеки jQuery -->
    <script src="https://yastatic.net/jquery/3.1.1/jquery.min.js"></script>
    Ответ написан
    2 комментария
  • Как в php удалить из строки определенные теги? Функция strip_tags удалет все кроме определенных. А мне нужно только определенные. Как это сделать?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Валидных HTML тегов – конечное множество. Их все можно перечислить. Исключить «определенные».

    Потом strip_tags().
    Ответ написан
    2 комментария
  • Как переписать функцию на современный лад?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В таком виде, как написали, можно просто
    (() => {
      a();
      b();
      c();
    })()
    Ответ написан
    Комментировать
  • Как запустить AJAX в цикле?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    function poll() {
      $.post("https://vash.api.com", {name: "Aladdin", id: "001"}, function(response) {
        if( response.ok === 'OK') { // получен нужный ответ
          window.location.reload(true);
        } else {
          setTimeout(poll, 8000);
        }
      });
    }
    
    poll();
    Ответ написан
    Комментировать
  • Как найти пересечения среди N временных отрезков?

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    Надо отсортировать по времени события вида {id: 2, type: "start"} или {id: 4, type: "end"}
    Один раз перебрать эти времена, двигаясь по одному, и отслеживая текущее окно: кто в нём. Из этого понятно, кто с кем пересекся.
    Ответ написан
    1 комментарий
  • Можно ли как-нибудь 'запрограммировать' кнопку извлечь диск?

    Можно какой-нибудь доп. утилитой.
    Кнопка Eject и так используется для полезных целей:

    • control + eject = диалог sleep, restart или shut down.
    • command + option + eject = сразу заснуть
    • control + command + eject = перезагрузка
    • control + option + command + eject = выключить
    • control + shift + eject = заснет дисплей
    Ответ написан
    Комментировать