Задать вопрос
  • Репост/пост на стенке у пользователя ВК API.?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Можно не указывать. По умолчанию на стене пользователя разместится.
    Ответ написан
    Комментировать
  • SessionStorage взять значения?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Сохраняйте только значение флага и при загрузке страницы выполняйте функцию.

    Объект для сохранения в *Storage сериализуется в текст. Как JSON.stringify() При этом теряются исполняемые методы и ссылки на узлы DOM-дерева. Да и само DOM-дерево-то на новой странице будет уже другое.
    Ответ написан
  • Почему не работает код js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    На момент выполнения кода jQuery еще не загружен.
    Ответ написан
    5 комментариев
  • Дайте совет, как построить самый простой график?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Без библиотек, как я понял по комментариям ТС, можно просто отрисовать график в SVG и разместить на сайте.
    Это можно сделать в Adobe Illustrator или другом векторном редакторе и вывести оттуда готовый SVG.

    Из массива координат строить график также можно без библиотек, разобравшись в несложном синтаксе SVG и самостоятельно написав простой код. Вам понадобится добавлять элементы line.

    Удобнее, с прицелом на будущее, использовать дополнительную, не-jQuery и не-Bootstrap, библиотеку. В идеале разобраться с D3js. Там и масштабирование осей под данные, и динамическое обновление графика по данным и интерактивность – всё легко кодируется, но придётся инвестировать пару часов в обучение.
    Ответ написан
    Комментировать
  • Как реализовать некоторый аналог сессий на JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вполне можете при добавлении ноутбука в клиенте отправлять эти данные и на сервер, там хранить в сессии и при загрузке страницы отдавать массив уже отобранных.

    Иначе, как уже посоветовали, в localStorage:
    // при добавлении ноута в коллекцию
    localStorage.setItem('laptops', JSON.stringify( laptopArray ));
    
    // при рендере страницы после перехода
    var laptopArray = JSON.parse(localStorage.getItem('laptops')) || [];
    Ответ написан
    Комментировать
  • Почему функция не привязывается к указаному классу?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    TypeError: $ is not a function

    не подключён jQuery на момент выполнения этого кода.
    Ответ написан
  • Как автоматически отправить первое сообщение ВКонтакте при переходе пользователя по с ссылке с сайта без использования сторонних сервисов?

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

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    Масштабирование происходит относительно выбранной точки, центра. Из центра проводятся векторы в каждую из вершин многоугольника. Длина каждого вектора умножается на k. При умножении на 0, многоугольник коллапсирует в эту точку. Или при плавном увеличении k, многоугольник «растет» из этого центра. И располагаться этот центр может где угодно – точка произвольная.

    Вам нужно только решить, где центр.

    Если расположить центр в (0, 0) задача упрощается, т.к. координаты вершин совпадают с векторами в них из центра.

    На JS могла бы быть примерно такая функция, принимающая на вход коэффициент k, массив координат центра и массив массивов координат точек:
    function scale( k, center, points) {
      return points.map( p => p.map( (x, i) => center[i] + k * (x - center[i])));
    }
    
    scale(
      2, // в два раза
      [3, 1], // относительно точки (3,1)
      [ [0,0], [1,1], [3,1], [10,10] ] // этот четырёхугольник
    )
    // [ [-3, -1], [-1, 1], [3, 1], [17, 19] ]

    В любом N-мерном пространстве годится. Сделал живой пример, можно поиграть: клик по полю назначает центр масштабирования
    Ответ написан
  • Как применить условие к нескольким классам и id?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    перечислить селекторы через запятую?

    Вместо ".required" написать ".required, #parent_cat_id, #category_id"
    Ответ написан
    2 комментария
  • Как убрать интервалы времени на графике D3 JS?

    Может, поможет пример: убирают выходные дни
    Ответ написан
    Комментировать
  • VK_API как отсылать случайные изображения?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    1. получить список изображений в альбоме группы: photos.get()
    2. выбрать N случайных
    3. отправить их как приложения к сообщению: поле attachment в messages.send()
    Ответ написан
    6 комментариев
  • Как можно улучшить дизайн этой визитки?

    • не смешивать языки: русский и англ.
    • мелкий белый текст будет нечитабельным на визитке 9x5см
    • белый текст по темному фону придется печатать офсетом пятой белой краской, это дорого.
    • «каньон» пишется через А.
    • телефонный номер лучше читается без лишних дефисов.
    • логотип менее важен, чем телефон и пр. информация – больше места под инфу, меньше под лого
    • название "Dag trip" близко к "Bad trip".
    Ответ написан
    3 комментария
  • Как реализовать автоматическую коррекцию формата ввода в калькуляторе на JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вот такое регулярное выражение заменит ноль в начале строки на пустую строку, если за нулём НЕ идёт один из . + - * /

    var re = /^0(?![\.\+\-\/\*])/;
    
    ['03','0','0.','0+'].map(s => s.replace(re,'')) /* 3,,0.,0+ */


    Просто единственный ноль также удалится – ведь за ним не идёт один из спец-символов. Поэтому применяйте эту регулярку только когда длина строки больше 1.
    Старый ответ

    Неудобно организовано, т.к. содержание табло может поменяться из нескольких мест..
    С минимальными правками отн. нынешнего варианта, можно попробовать так:
    везде, где изменяется содержание табло, получать введённые числа (бить строку по одному из + - * /; каждую из частей бить по точке, и каждое из получившихся целых прогонять через parseInt() – это отбросит нули в начале. Потом собирать: склеить точкой, склеить знаком операции.

    Но лучше как-то иначе организовать всю логику. Например, в процессе ввода не текстовую строку собирать, а заполнять массив числами и операторами. [5.1, "*", 4.2, "-", 3.7] И перед склейкой в одну строку для отображения в табло, проводить необходимые коррекции чисел.
    Ответ написан
  • Ffmpeg зациклить видео, как?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Возможно, mp4 не позволяет простой конкатенации файлов, поэтому при склейке он декодируется и снова жмётся.

    Быстрее один раз разжать видео в .ts формат, который потом можно просто склеивать.
    Делал похожее для сборки mp3+картинки в статичное видео.

    Примерно так:
    bash скрипт
    #  из mp4 сделать ts
    TMPVIDEO="tmp_video.ts"
    ffmpeg  \
      -i "short.mp4"  \
      -bsf:v h264_mp4toannexb  \
      -an  \
      -f mpegts  \
      -y -hide_banner  \
      "$TMPVIDEO"
    
    # до этого определить, сколько раз повторить фрагмент,
    # чтобы покрыть длину mp3
    REPEATS=5
    LONGVIDEO="long_video.ts"
    N=1
    while [ $N -le $REPEATS ]; do
    	ffmpeg -i "concat:$TMPVIDEO|$TMPVIDEO" \
    	    -c:v copy \
    	    -y -hide_banner  \
    	    "$LONGVIDEO"
    
    	local STATUS=$? ; if [ $STATUS -ne 0 ]; then return $STATUS; fi
    
    	rm -f "$TMPVIDEO"
    	mv "$LONGVIDEO" "$TMPVIDEO"
    	local N=$[$N << 1]
    	echo "N: $N"
    done
    # получили длинное видео с запасом
    
    # подрезать длину, чтобы точно соответствовала
    FFMPEG -i "$TMPVIDEO" \
      -c:v copy \
      -t $MUSIC_LENGTH \
      -y -hide_banner  \
      "$LONGVIDEO"


    Потом остаётся собрать из аудио и видео общий файл. В mp4 аудио идёт в формате AAC. Для скорости можно заранее разжать mp3 в aac, заодно измерив точную длительность.
    Ответ написан
  • Как правильно получить элемент по классу (js)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно через querySelectorAll()
    // внутри ul с классом list ищем все li
    var myNodeList = document.querySelectorAll('ul.list li');
    
    if( myNodeList.length) { // что-то нашлось, коллекция не пустая
      var el0 = myNodeList[0]; // первый 
    }
    Рабочий пример

    Метод querySelectorAll() есть и у документа и у элемента. Так что можно сначала получить элемент, внутри которого искать, а затем внутри него собрать коллекцию:
    var list = document.querySelectorAll('ul.list'); // все UL класса list в документе
    if( list.length) {
      var items = list[0].querySelectorAll('.list');
      // любые элементы класса list внутри первого найденного ul.list
    
      if(items.length) {
        var item = items[0]; // первый из li
      }
    }
    Ответ написан
    Комментировать
  • Как изменять размеры svg в зависимости от размеров внешнего контейнера?

    В принципе SVG вписывается в контейнер, достаточно задать тому ширину, а элементу svg указать viewbox.

    Один глюк, который не понимаю. Если viewbox задать программно, как у вас в фиддле, через .attr('viewbox', '0 0 1200 250') – svg не становится «живым». Зато если через инструменты разработчика иму изменить параметр viewbox, например, вместо 1200 поставить 1201, все оживает: график вписывается в ширину и меняется при изменении окна.

    Глюк исправляется, если не создавать программно SVG и атрибут, а прописать их сразу в HTML.
    Рабочий fiddle.
    Ответ написан
    Комментировать
  • Как это работает (алгоритм с использованием рекурсии для вычисление числа Фибоначчи)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Числа Фибоначчи – это последовательность, начиная с 0 и 1, где каждый следующий равен сумме двух предыдущих.

    Третий равен 0 + 1 = 1 // итого первые три ряда: 0 1 1
    Четвёртый это сумма последних двух единиц = 2 // 0 1 1 2
    Пятый это 1 + 2 = 3 // 0 1 1 2 3
    И так далее. Вот начало ряда:
    значение:         0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144
    порядковый номер: 0  1  2  3  4  5  6   7   8   9  10  11  12
    Восьмой, если считать с 0, равен 21.

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

    Чтобы вычислить очередное значение, надо знать два предыдущих. Отсюда и (n-1) и (n-2)

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

    Движок JavaScript'а сам позаботится о хранении промежуточных значений и цепочки кто-кого вызвал и с каким параметром.
    Ответ написан
    Комментировать
  • Бинарный поиск в координатной сетке?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    По координатам вычисляйте индекс квадрата. Что-то типа dlina_stroki * position.y + position.x
    Это точно быстрее поиска, пусть и бинарного )

    Если там действительно квадраты через единый шаг, то так должно получиться. Квадраты в массиве ведь упорядочены по колонкам, столбцам? Пример с реальными данными помог бы.

    Допустим, там целочисленные координаты от 0 до 1800 с шагом 200. Поле 10x10 — массив длиной 100.
    0,0      200,0    400,0    ... 1800,0
    0,200    200,200  400,200  ... 1800,200
    0,400    200,400  400,400  ... 1800,400
    ...
    0,1800   200,1800 400,1800 ... 1800,1800


    Интересует индекс элемента (400,200)

    i = storona * y / shag + x / shag

    Шаг у нас shag = 200 значит, искомый индекс 10 * 200 / 200 + 400 / 200 = 12
    Ответ написан
    Комментировать
  • LocalStorage создание и получение?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно. Курить документацию по localStorage и по Storage
    const dg = document.getElementById.bind(document);
    const inKey = dg('in-key');
    const inVal = dg('in-val');
    dg('btn-to').addEventListener('click', e => {
      localStorage.setItem(inKey.value, inVal.value);
    });
    dg('btn-from').addEventListener('click', e => {
      inVal.value = localStorage.getItem(inKey);
    });
    dg('btn-list').addEventListener('click', e => {
      let list = [];
      for (let i = 0; i < localStorage.length; i++) {
        let k = localStorage.key(i);
        list.push('<dt>'+k+'</dt><dd>'+localStorage.getItem(k)+'</dd>');
        dg('list').innerHTML = list.join('\n');
      }
    });
    рабочий пример
    Ответ написан
    3 комментария