• Есть ли возможность перенаправить человека в telegram с заготовленным сообщением?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Такой возможности нет. Можно передать текст в аргумент команды start бота. Больше информации в официальной документации https://core.telegram.org/api/links

    Возможно, более разумным является веб-логин через Телеграм на самом сайте или, например, использование Web App в самом Телеграме. Но это надо существенно пересматривать всё взаимодействие с пользователем.
    Ответ написан
    Комментировать
  • Как разместить N файлов по папкам?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Это задача об упаковке. Она сложная. И ближе даже не к задаче о рюкзаке, а к задаче о мульти-рюкзаке. Для больших размеров файлов и N решения, кроме переборного, нет.

    Если N маленькое, то есть быстрые алгоритмы вроде Динамического Программирования. Но там и перебор будет не то, чтобы сильно медленнее.

    Если вам не важно получить абсолютно минимально возможное количество папок, то подойдет какое-нибудь жадное решение. Оно даст хорошее приближение. Скажем, вместо 30 идеальных папок вы часто получите 40.

    Например, кладите файлы в текущую папку, пока они туда помещаются. Потом создавайте следующую папку. Заполняйте ее, пока размер папки + размер следующего файла <= 2Mb.

    Можно всякие эвристики сюда навешивать: например, отсортиовали файлы по размеру. Жадно пихаем самые большие файлы, пока помещается. Потом жадно пихаем самые маленькие. Потом начинаем новую папку.
    Ответ написан
    Комментировать
  • Как получить уровни вложенности для всех вложенных объектов?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Функции добавить параметр - глубину вложенности.

    Проверяем, чем является значение, если не объект, то возвращаем как есть. Иначе собираем новый объект, в который записываем текущую глубину вложенности и свойства исходного объекта, обработав их значения функцией - делаем рекурсивный вызов с глубиной вложенности, увеличенной на единицу:

    const addDepth = (val, depth = 0) =>
      val instanceof Object
        ? Object.entries(val).reduce((acc, n) => (
            acc[n[0]] = addDepth(n[1], depth + 1),
            acc
          ), { depth })
        : val;
    Ответ написан
    Комментировать
  • Почему консоль выводит это значение?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Вы пытаетесь в качестве имени свойства использовать объект, а JS разрешает там только строки.
    Объект приводится к строке и ваш код превращается в итоге вот в это:
    dwayne['[object Object]'] = 123;
    dwayne['[object Object]'] = 456;
    
    console.log(dwayne['[object Object]']);

    Думаю, тут уже понятно, почему результат именно такой.

    При этом, если бы вы использовали другой синтаксис, то и результат был бы другим:
    dwayne.daniel = 123; // аналог dwayne['daniel']
    dwayne.jason = 456; // аналог dwayne['jason']
    
    console.log(dwayne.daniel);

    Но эти daniel и jason никак не связаны с одноимёнными объектами выше.
    Ответ написан
    1 комментарий
  • Как строку с часами, минутами и секундами преобразовать в число?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Засовываем в массив пары из регулярного выражения, с помощью которого из строки достаётся число перед единицей измерения, и эквивалентного данной единице измерения количества секунд; оббегаем этот массив, выдёргиваем числа, умножаем их на количество секунд, складываем:

    const units = [
      [ 'де?н', 24 * 60 * 60 ],
      [  'час',      60 * 60 ],
      [  'мин',           60 ],
      [  'сек',            1 ],
    ].map(n => [ RegExp(`\\d+(?=\\s+${n[0]})`), n[1] ]);
    
    const getSeconds = str =>
      units.reduce((acc, n) => acc + n[0].exec(str) * n[1], 0);

    getSeconds('2 часа 22 секунды') // 7222
    getSeconds('99 минут') // 5940
    getSeconds('1 час 1 минута 1 секунда') // 3661
    getSeconds('1 день 23 часа 59 минут 60 секунд') // 172800
    getSeconds('2 дня') // 172800
    getSeconds('546 секунд и ещё 2 минуты') // 666

    Если вдруг возможно повторение единиц измерения внутри одной строки, то поиск с помощью регулярных выражений должен быть глобальным - RegExp(`\\d+(?=\\s+${n[0]})`, 'g'), а функция подсчёта секунд примет следующий вид:

    const getSeconds = str =>
      units.reduce((seconds, [ reg, multiplier ]) => {
        return [...str.matchAll(reg)].reduce((acc, n) => acc + n * multiplier, seconds);
      }, 0);
    
    // или
    
    const getSeconds = str => units
      .flatMap(n => (str.match(n[0]) ?? []).map(m => m * n[1]))
      .reduce((acc, n) => acc + n, 0);
    
    // или
    
    const getSeconds = str => eval(units
      .map(n => `${n[1]} * (${str.match(n[0])?.join('+') ?? 0})`)
      .join('+')
    );

    getSeconds('1 секунда плюс 3 секунды плюс 5 секунд') // 9
    getSeconds('21 день, 7 дней, да ещё 3 дня - всего секунд в мае месяце будет') // 2678400
    Ответ написан
    2 комментария
  • Как сделать подобную анимацию?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    Никакой Three.js тут не нужен. Ну то есть, конечно, никто не мешает сделать все это на WebGL и прикрутить здоровенный фреймворк сверху, но все же это будет слегка избыточным решением в большинстве случаев. Такое можно аргументировать только если весь сайт изначально так и делается на WebGL и это просто "один из" эффектов, которые туда нужно интегрировать.

    В 99% остальных случаев подобные штуки делаются одной svg-картинкой, одним path, который рисуется в зависимости от положения мышки и размеров контейнера. Немного школьной геометрии, ограничение диапазона возможных смещений всего этого - и дальше можно до посинения играть с алгоритмом расчета смещения, до тех пор, пока реакция на мышку не начнет нравится. Там уже нет универсального рецепта, все от дизайна зависит. Можно линейно привязать к положению мыши. Это обычно выглядит скучно. Можно использовать какую-то функцию от расстояния до центра, чтобы сделать движения менее равномерными. В каких-то случаях делают полноценный эффект инерции, как верно подмечено в соседнем ответе. Там получаются более естественные движения (обычно все это является развитием гравитационных моделей). Есть совсем замороченный подход, когда используется моделирование системы пружин (для общего развития можно загуглить силовые алгоритмы визуализации графов). Там можно получить целый ряд занятных эффектов, которые часто оказываются в тему как раз в таких фонах, где какие-то штуки связаны между собой прямыми линиями. Ну и можно просто вдохновиться какими-то физическими явлениями и сделать что-то "по мотивам".

    Ответ написан
    22 комментария
  • Существует ли способ получить список классов, которые используют тот или иной аттрибут?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Includ'ите все файлы, содержащие ваши классы, получаете список имён всех классов (get_declared_classes), для каждого делаете рефлексию (new ReflectionClass), и проверяете список атрибутов (getAttributes).
    Ответ написан
    Комментировать
  • Как удалять теги из массива, которые уже не используются?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Зайдите с другой стороны - вместо удаления того, чего больше нет, получите то, что есть, и замените массив:

    tags = Array.from(new Set(data.flatMap(n => n.tags)));

    Если массив по какой-то причине заменять нельзя, тогда удалите все элементы из существующего и запишите новые:

    tags.splice(0, tags.length, ...new Set(data.flatMap(n => n.tags)));
    Ответ написан
    Комментировать
  • Почему нельзя клонировать события?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Ну потому что не берёт: The structured clone algorithm > Supported types

    Cloning DOM nodes likewise throws a DataCloneError exception.
    Как минимум нельзя клонировать DOM, а в Event есть на него ссылки.
    Ответ написан
    1 комментарий
  • В чём деловая польза нейросетей?

    vpetrov
    @vpetrov
    частный SEO-специалист
    Странный вопрос.
    Нейросеть способна обработать такой объём данных, который никакой человек обработать физически не в состоянии. Если вам нужны найти скрытые связи, из монолита вычленить скульптуру, вообще работать с данными - тут нейросеть незаменима.
    То, о чём вы говорите - это крайне попсовое и глупое применение мощнейшего инструмента. И этот инструмент в доступе уже лет примерно 20. Просто кожаным показали самые примитивные возможности - и этого хватило, чтобы массы забились в оргазме и ужасе.
    Ответ написан
    Комментировать
  • Есть ли статьи, которые приводят наглядные примеры того, как код на rust превосходит код на других языках?

    vabka
    @vabka Куратор тега Rust

    Особенно там, где был использован язык Си или С++

    (если исключить memory safety и fearless concurrency)
    1. Хороших плюсовиков найти всё сложнее, ибо молодые разработчики часто хотят что-то более современное/простое/приятное.
    2. Переход с какого-нибудь более высокоуровнего языка на Rust гораздо легче, чем на C++
    3. DX у Rust на порядо лучше.
    4. Код на Rust на порядок более выразительный, чем код на Си

    За счёт этого поддержка кодовой базы на Rust заметно дешевле выходит

    Например вот что Тинькофф пишет:

    Наш Процессинговый Центр занимается разработкой финансовых систем, критичных к даунтайму и времени обработки. Изначально мы делали все свои продукты либо на чистом Си, либо на плюсах (C++14), однако пару лет назад мы переписали большой кусок нашего бэкенда на Rust, и нам настолько понравилось, что теперь все наши новые процессинговые сервисы пишутся на нём.



    Мне бы хотелось видеть какое-то сравнение, что вот так стало сильно лучше и безопаснее, а вот было так написано изначально на оригинальном языке

    Это можно будет определить только если ведётся статистика по багам и они классифицируются по причинам возникновения, но такую статистику ведут не все.
    В среднем статистика показывает, что багов связанных с неправильной работой с памятью в проектах на Rust на порядки меньше, чем в проектах на C++.


    ну тут все-равно unsafe

    В проектах на Rust он явный и от него можно избавиться, завернув в безопасную обёртку, которая будет гарантировать корректную работу с памятью и ffi.
    В проектах на C++ у тебя по факту всё является unsafe.

    ну, нам еще нужен подсчет ссылок

    В плюсах тоже активно пользуются подсчётом ссылок и всякими умными указателями, если по коду не очевидно, когда можно будет освободить память
    Ответ написан
    6 комментариев
  • Зачем перед str ставить +?

    axifive
    @axifive
    Software Engineer
    Чтобы преобразовать строку в число

    +"76" == Number("76")
    Ответ написан
    3 комментария
  • Как с помощью input открыть нужный элемент массива?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    1. Код стоит оформлять соответствующим образом - с помощью тэга <code> который доступен в редакторе с помощью кнопки </>.
    2. Нужно иметь знания обработки событий. Например обработка клика по кнопке.
    3. Знания вывода на экран (Вы не указываете как именно должно выводиться, поэтому в элементарном примере это alert)
    4. Знания работы с полями ввода и поиском элементов в dom. То есть нужно будет найти инпут в DOM дереве и считать его свойство value.
    5. Знания по работе с массивами. А именно .filter - для отсеивания не соответствующих элементов.
    6. Ну и скорее всего метод .includes тоже пригодится для проверки вхождения введённого текста в genre элементов массива.
    7. Ну и само собой понимание что такое объект и как считывать его свойства.

    итого на псевдокоде:
    по нажатию на кнопку --> взять значение из инпута --> прогнать исходный массив через фильтр по значению инпута и свойству genre --> вывести результат на экран
    Ответ написан
    Комментировать
  • Как работать внутри двух контейнерах через vscode?

    yarkov
    @yarkov
    Помог ответ? Отметь решением.
    Открыть 2 окна vscode?
    Ответ написан
    2 комментария
  • Разделить платный доступ к Wi-Fi на несколько человек?

    Sanes
    @Sanes
    Не связывайтесь с интернетами. Тем более с непонятными людьми. Время неспокойное, будете крайним.
    Этим должен заниматься провайдер.
    Если всё же решили поиграть в рулетку, то смотрите решения на базе Captive portal.
    Можно и вручную выдавать пароль.
    Ответ написан
    1 комментарий
  • Как сделать что-бы при клике на кнопку блоки добавлялись по очереди?

    0xD34F
    @0xD34F Куратор тега JavaScript
    О каких кнопках и блоках идёт речь; по сколько блоков надо показывать при клике на кнопку; как показать блоки, если известна кликнутая кнопка:

    const buttonSelector = '.added';
    const itemSelector = '.added-block';
    const activeClass = '_active';
    const notActiveSelector = `${itemSelector}:not(.${activeClass})`;
    const newActiveCount = 2;
    
    function onButtonClick(button) {
      const items = [...button.parentNode.querySelectorAll(notActiveSelector)];
      items.slice(0, newActiveCount).forEach(n => n.classList.add(activeClass));
      button.disabled = items.length <= newActiveCount;
    }

    Назначаем обработчик клика каждой кнопке индивидуально:

    document.querySelectorAll(buttonSelector).forEach(function(n) {
      n.addEventListener('click', this);
    }, e => onButtonClick(e.currentTarget));

    Или, применяем делегирование:

    document.addEventListener('click', e => {
      const button = e.target.closest(buttonSelector);
      if (button) {
        onButtonClick(button);
      }
    });
    Ответ написан
    Комментировать
  • Дан массив с числами. Как найти сумму элементов, расположенных от начала массива до первого отрицательного числа?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    let sum = 0;
    for (let i = 0; i < arr.length && arr[i] >= 0; i += 1) {
      sum += arr[i];
    }
    Ответ написан
    Комментировать
  • Как найти фрагмент кода который меняет тег при загрузке страницы?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Через брейкпойнт не реально найти, скриптов слишком много, к тому же я думаю что меняет какой то внешний скрипт.
    642712badd85e953685607.png
    Ответ написан
    3 комментария
  • Как вывести любую часть древовидного списка?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега MySQL
    Для реализации этой задачи хорошо подходит хранение в виде Nested Set. Хранение в виде Adjacency List подразумевает рекурсию и полную выборку.

    Но самое простое решение в данном случае - просто закешировать отсортированную выборку, не меняя хранение, и резать для пагинации уже её.
    Ответ написан
    Комментировать