• Как из массива сделать новый массив-матрицу, создав столбцы и колонки?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Как я понял, длина входного массива всегда на 1 меньше квадрата целого. Иначе не получится, дописав один ноль, получить квадратную матрицу.

    Округляем в большую сторону квадратный корень из длины входного массива – это будет сторона квадратной матрицы. Проверяем, что длина всего на 1 отличается от квадрата.

    Старый вариант в лоб

    Дальше перебор строк и столбцов и наполнение.
    function toMatrix(arr) {
      const len = arr.length;
      const side = Math.ceil( Math.sqrt(len));
      if( side * side - len !== 1) throw "Bad array length";
      let result = [], index;
      for(let row = 0; row < side; row++) {
        result.push([]);
        let currentRow = result[result.length - 1];
        for(let col = 0; col < side; col++) {
          index = side * row + col;
          if(index > len) break;
          if(index === len) {
            currentRow.push(0);
          } else {
            currentRow.push(arr[index]);
          }
        }
      }
      
      return result;
    }
    
    
    toMatrix([1,2,5]) // [[1,2],[5,0]]
    toMatrix([1,2,3,4,5,6,7,8]) // [[1,2,3],[4,5,6],[7,8,0]]


    Upd. незачем по одному копировать элементы, надо орудовать целыми строками )
    function toMatrix(arr) {
      const len = arr.length;
      const side = Math.ceil( Math.sqrt(len));
      if( side * side - len !== 1) throw "Bad array length";
      let result = [];
      for(let row = 0; row < side; row++) {
        result.push( arr.slice(side * row, side * (row+1))); // выкусываем подряд строку, side элементов
      }
      result[side - 1].push(0); // в последниюю строку дописываем 0
      
      return result;
    }
    
    toMatrix([1,2,5]) // [[1,2],[5,0]]
    toMatrix([1,2,3,4,5,6,7,8]) // [[1,2,3],[4,5,6],[7,8,0]]
    Ответ написан
    4 комментария
  • Как создать список всех id, с которыми у меня диалог в vk через группу?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Метод messages.getDialogs() поможет.
    Вызывать с ключом доступа Сообщества с правами messages.
    Ответ написан
    Комментировать
  • Можно ли получить доступ к объекту?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Без перебора, в общем случае, способа нет.

    Но вы можете добавить индекс (словарь) и при занесении внутренних объектов записывать в индекс пары
    значение_поля_внутреннего_объекта: ключ_внешнего_объекта


    Примерно так
    var house = {}; // внешний объект
    var names = {}; // доп. словарь для поиска
    function add(num, flat) {
      house[num] = flat; // добавили внутренний объект
      names[flat.name] = num; // запись для поиска в словарь
    }
    
    add(11, {name:"Vasya", phone:"555-111", area:111, price:1111});
    add(22, {name:"Lena", phone:"555-222", area:222, price:2222});

    Чтобы найти свойство, под которым записан объект, смотрите в "словаре":
    names["Lena"] // 22
    
    function get(name) {
      return house[ names[name]];
    }
    
    get("Lena") // {name:"Lena", phone:"555-222", area:222, price:2222}


    Хотя проще сделать просто словарь значение_поля: сам_внутренний_объект
    Ответ написан
    Комментировать
  • Какова суть генерации своих событий в JavaScript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Попробую на пальцах объяснить.

    Событие – это конверт, на котором написано его название. Внутрь конверта можете вложить что-нибудь, а можете оставить конверт пустым.

    Элемент – это столик. Кто угодно может подойти и положить на столик свой конверт.

    Слушатель – это мужик, который топчется около столика и смотрит, нет ли чего с интересующим его названием. Может несколько человек поджидать конвертики с определённым названием – прочтут все, если только в конверте не написано «по прочтении съесть» – тогда кто-то съест и дальше не передаст.

    Как создать/отправить конверт. В любом месте кода создайте конверт и дайте ему название: var myEvent = new Event('teaTime'); Остается положить конверт на нужный столик:
    document.getElementById('stolik').dispatchEvent(myEvent);


    Чтобы в событие вложить какие-то данные, нужно использовать другой конструктор и передать нагрузку в поле detail:
    var event = new CustomEvent('saySomething', { detail: "Hello there!" });


    Для чего нужно создавать свои события? Чтобы развязать куски кода. Например, в разных местах документа можно нажать на кнопку повторяющегося виджета. Виджет создаст на document событие "widgetClicked". А ещё несколько одинаковых компонентов в странице, слушающих document на предмет события "widgetClicked", получат пинок и что-нибудь вытворят.
    Ответ написан
    2 комментария
  • Чем и как ограничивать количество запросов к API?

    sergiks
    @sergiks Куратор тега Веб-разработка
    ♬♬
    Пользователи должны идентифицироваться: по ключу лучше всего.

    Скажем, вы хотите установить лимит не более 10 запросов в 15 секунд.
    Для учета можно использовать не БД а Redis.

    Ключ - ключ API пользователя, значение - список. Хранить списки (Lists) timestamp'ом последних 10 запросов. Установить время жизни в 15 секунд.
    При поступлении нового запроса смотреть, есть ли уже такой ключ и не более 10 записей в списке. Если меньше, дописывать в конец текущее время и разрешать выполнение запроса. Если 10 записей есть, но самая левая более 15 секунд назад, её можно стереть и справа вставить новую.
    Ответ написан
    1 комментарий
  • Как разбить строку в массив?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Можно использовать регулярное выражение (раз такой тег стоит в вопросе). Буквально «всё, что угодно, затем пробел-со-скобкой, потом всё до скобки, скобка». Из полученного массива выкинуть нулевой элемент, где содержится вся строка целиком:
    preg_match('/^(.+)\ \((.+)\)/', $name, $matches);
    array_shift($matches);
    $matches; /*Array
    (
        [0] => Ньютон И.И.
        [1] => Тринити коледж, Кембридж
    )*/


    Можно и просто отрезать последний символ, а затем разбить в массив, используя в качестве разделителя пробел-с-открывающей-скобкой : )
    без регулярных выражений
    $name = "Ньютон И.И. (Тринити коледж, Кембридж)";
    	$name = substr($name, 0, -1);
    	$result = explode(' (', $name);
    	print_r($result);
    Ответ написан
    1 комментарий
  • Почему так происходит "data.foreach is not a function"?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Дело в том, что массив фильмов, если посмотреть, содержится не в корневом объекте ответа, а в поле results.

    Т.е. вам надо поменять на:data.results.forEach( film => {
    Ответ написан
  • Как грамотно и красиво сформировать вложенность функций? Структура кода?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Добавление/удаление класса по мышиному событию лучше доверить CSS и использовать псевдокласс :hover

    Вместо подобных пар
    $('.sounds-wrapper').on('mouseenter', function() {
          $(this).addClass('sounds-wrapper-active');
        });
        $('.sounds-wrapper').on('mouseleave', function() {
          $(this).removeClass('sounds-wrapper-active');
        });


    лучше назначить свойства для
    .sounds-wrapper { ... }
    .sounds-wrapper:hover { ... здесь то, что раньше было в .sounds-wrapper-active }
    Ответ написан
  • Какие изображения использовать на сайте оптовой продажи замороженной рыбы?

    sergiks
    @sergiks Куратор тега Веб-разработка
    ♬♬
    Посмотрите зарубежные аналоги для вдохновения и сделайте иначе, лучше.
    Ответ написан
    Комментировать
  • Как быстро перебрать большой объем данных?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Сделать задачу асинхронной.

    1. присылают объёмный json с данными пользвателей, полем сравнения, (ключами авторизации) и uuid задачи и адресом callback куда ваш api отправит ответ – потом, позже;
    2. данные приняли, сохранили, создали задачу, поместили её в очередь задач, клиенту на запрос ответили "ОК, приняли, сделаем - ответим". Ведь если клиент не один, может, сразу десятку клиентов вздумается именно в полночь прислать по миллиону своих пользователей – итого 10 млн. «В очередь, с*кины дети, в очередь!» «Вас много, а я одна!» : )
    3. один или несколько «рабочих» (серверов, процессов) из очереди забирают каждый по одному заданию и как могут быстро их выполняют, готовят ответ, отправляют по адресу callback. Если отправка не удалась, что-то сглючило на стороне клиентов, в очередь помещается подзадача только повторной отправки ответа через N секунд, не более M раз.
    Ответ написан
    4 комментария
  • Как разобраться с преобразованием Фурье?

    Не возьмусь объяснить преобразование Фурье (ПФ) лучше приведенной статьи на Хабре.

    Есть некая интуиция. Простая скучная идеальная синусоида после ПФ это всего один пик, на значении её частоты. На старых аналоговых синтезаторах звук делался ползунками, задающими гармоники. Помимо основной синусоиды, добавлялись другие гармоники. Скажем, на октаву выше (послабее основного тона), на две октавы выше (еще слабее). Это меняет тембр звука и форму волны. «На октаву выше» – после ПФ это ещё один пик, с частотой вдвое выше основной. «На две октавы» - в 4 раза бОльшей частотой. Ползунки в таком синтезаторе буквально двигают величину этих пиков в графике после ПФ.

    em14_1.jpg

    Преобразование Фурье волшебным образом из поступающего сигнала создаёт «рисунок ползунков» синтезатора для создания точно такого же звука.

    Теперь к гитаре. Если одну открытую струну аккуратно мягко несильно дернуть в районе 12-го лада, будет преобладать её основной тон. Обертона тоже обнаружатся, именно их наличие составляет отличие звука струны гитары от скучной синусоиды синтезатора. Эффекты перегруза значительно меняют спектр, делая из примерно-синусоиды почти прямоугольную волну.

    Из одно-двух-канальной записи гитарного аккорда однозначно определить ноту каждой струны не получится. Хотя бы потому, что одну ноту можно получить несколькими способами на разных струнах. Если гитара обработана перегрузом, интервалы могут сливаться в новые частоты. Например рифф в начале Skindred - Babylon (первое, что пришло в голову)

    Line6 выпускает гитары, где датчики снимают индивидуально каждую струну. Это позволяет налету переключать строй гитары: из стандартного EBGDAE в dropped-D EBGDAD и другие. Сигнал каждой струны индивидуально перестраивается на нужный интервал перед дальнейшей обработкой.
    Ответ написан
    Комментировать
  • Как использовать один и тот же кеш на разных доменах в Laravel?

    Посмотрите реализацию /Illuminate/Cache/MemcachedStore
    Там в строке 103 видно, что помимо ключа используется prefix:
    $this->memcached->set($this->prefix.$key, $value, $this->toTimestamp($minutes));


    Не стал рыться в исходниках Laravel глубже. Скорее всего, префикс состоит из уникального ключа из конфига.

    Для вашей задачи надо найти момент инициализации этого Store и сделать так, чтобы использовался одинаковый префикс как для api, так и для operator.
    Ответ написан
    2 комментария
  • Как имитировать заполнение формы пользователем?

    sergiks
    @sergiks Куратор тега Веб-разработка
    ♬♬
    Есть несколько разных способов / подходов. Наверняка одним логином на сайт дело не заканчивается. Поясните, что нужно дальше – станет понятно, каким лучше воспользоваться.

    Несколько вариантов для примера:
    1. cURL
    2. JavaScript в консоли браузера
    3. написать свой плагин в браузер
    4. «безголовый» браузер: PhantomJS, headless Firefox, headless Chrome
    5. Python, requests, BeautifulSoup (пост на Хабре)
    6. макароны на PHP
    Ответ написан
  • Хочу сделать систему, чтобы при переводе с карты на карту часть оставалась у меня?

    sergiks
    @sergiks Куратор тега Веб-разработка
    ♬♬
    Лучше всего договориться с продавцом о вашей комиссии.

    Покупатель будет уходить напрямую к продавцу по вашей реф. ссылке, а вы сможете получать оговоренный процент с его покупок. Так работают Amazon, AliExpress.

    Дело в ответственности и доверии. Покупатель рискует не в одном месте (Магазине), а в двух: Вы (вы передумаете и просто оставите все деньги себе) и Магазин. Поэтому лучше, когда Покупатель напрямую общается с Магазином.
    Ответ написан
    Комментировать
  • Как в Docker на одном IP-адресе разместить несколько сайтов?

    Поднять ещё один контейнер nginx как единую точку входа, слушающую внешние порты 80 и 443.
    В зависимости от домена прокси на тот или иной внутренний ip контейнера-сайта.
    Ответ написан
    3 комментария
  • Что использовать при создании веб-приложения?

    sergiks
    @sergiks Куратор тега Веб-разработка
    ♬♬
    Попробуйте на Firebase
    Ответ написан
    Комментировать
  • Как получить значения массива в JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Так же, как первые три, получаете четвёртый. Только он не строка, а массив объектов.
    var answer = data['Answer'];
    for(var i=0; i<answer.length; i++) {
      answer[i].id // 1
      answer[i].text_answer // Ответ 1.1
    }
    Ответ написан
    3 комментария
  • Как переносить сервер?

    У DigitalOcean есть возможность сделать «снимок» (snapshot) VPS'ки. Это её образ, из которого можно воссоздать такую же точно VPS. Хранение snapshot'а стоит $0.05 / Gb в месяц. Объём зависит от использования диска в VPS.

    Т.е. когда вы довольны настройкой своей VPS, создаёте её Snapshot. Пока сервисы не нужны, гасите VPS - удаляете. И у вас остаётся только snapshot, за хранение которого платите. Когда сервисы снова понадобились, разворачиваете VPS из сохранённого snapshot'а – все настройки как были на момент сохранения. Вы молодец.

    По моей реф. ссылке на счёт в DigitalOcean дают $10, которых хватит на пару месяцев пятидолларовой VPS'ки с 512Mb/20Gb – попробовать.
    Ответ написан
  • Как сделать анимацию волнистой линии?

    рисовать её пунктирной линией с очень длинным штрихом, и менять смещение этого штриха.

    Пример
    Ответ написан
    Комментировать
  • Как вывести имя объекта в самом объекте?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно перебрать контекст в надежде найти себя:
    var context = this;
    
    var calina = {
      write: function() {
        for(var prop in context) {
          if(context[prop] !== this) continue;
          console.log("Found self:", prop);
          return prop;
        }
      }
    }
    calina.write();  // 'calina'


    Если это в корне выполняется, в браузере, то контекст известен и можно не вводить переменную context а «искать себя» в объекте window:
    так
    var calina = {
      write: function() {
        for(var prop in window) {
          if(window[prop] !== this) continue;
          console.log("Found self:", prop);
          return prop;
        }
      }
    }
    calina.write();  // 'calina'


    В контексте вполне может присутствовать несколько переменных, ссылающихся на этот один и тот же объект. var calina2 = calina; Предусмотрите этот случай и собирайте/возвращайте массив значений в таком случае.
    Ответ написан
    3 комментария