• Как отрисовывать линию в сторону курсора всегда фиксированной длинны?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    ctx = canvas.getContext('2d');
    setInterval(function draw_line() {
        // дано:
        // x, y - координаты курсора мышки
        // size - длина линии в пикселях
    
        // координаты начала линии
        const cx = document.documentElement.clientWidth / 2;
        const cy = document.documentElement.clientHeight / 2;
    
        // дельта X и Y (разница между коордами мышки и центром
        const dx = x-cx;
        const dy = y-cy;
        
        // расстояние от начала линии до мышки
        const dist = Math.hypot(dx, dy);
    
        // на сколько надо умножить Дельты, чтобы получить линию заданной длины
        const multiplier = size/dist;
    
        // высчитываем координаты конца линии
        const nx = cx + dx * multiplier;
        const ny = cy + dy * multiplier;
    
        // рисуем линию
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        ctx.beginPath();
        ctx.strokeStyle = "blue";
        ctx.moveTo(cx, cy);
        ctx.lineTo(nx, ny);
        ctx.lineWidth = "2";
        ctx.stroke();
    }, 1);
    Ответ написан
    Комментировать
  • Как добавить заданный текст в input?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    можно чтото типа такого написать, но это не очень кроссплатформенный способ)))
    https://codepen.io/lastuniverse/pen/QWQjMPN?editor...

    <body>
      <input type="text"> 
    
    <script>
      let inp = document.querySelector('input');
    
      inp.oninput = function(e) {
        const val = inp.value.replace(/[^\d\.]/g, '');
        const num = parseFloat(val);
        const str = (num!==num?'0':num.toString())+(e.data=='.'?'.':'');
        
        
        inp.value = str + ' рублей';
        if(inp.selectionStart>str.length){
          inp.focus();
          inp.selectionStart=str.length;
          inp.selectionEnd=str.length;
        }    
    };
    </script>
    
    </body>


    но этот способ для использования требует доработки логики. например:
    - могут ли быть введены дробные числа?
    - сколько может быть знаков после запятой?
    - правильно обрабатывать попытки ввести несколько точек
    - что используется для разделения целой и дробной части (точка?запятая? обе вместе?)
    - и т.д.

    Итого, наиболее правильным способом мне видится способ предложенный пользователем Чипекве , но его вы уже сами делайте
    Ответ написан
    Комментировать
  • Как грамотно сравнивать два файла?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Не придумывайте велосипед. Просто посмотрите как решают подобные вещи в других проектах, например git diff. В результате у вас будет аж 3 варианта использования:
    1. использовать уже готовый продукт (например тот же git-diff) как консольную утилиту
    2. использовать уже готовую библиотеку, решающую данный вопрос, подключив ее к своему коду
    3. посмотреть код уже готовых продуктов и либо использовать его, либо на основе написать свой
    Ответ написан
    Комментировать
  • Как найти одинаковые объекты в массиве и сложить их данные?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Вот корявенькое решение, без проверок на наличие полей, как улучшить думайте сами
    let arr = [
      [
        { name: 'Apple',  total: '5', id: '1'},
        { name: 'Banana', total: '11', id: '22'},
      ],
      [
        { name: 'Apple',  total: '1', id: '1'},
        { name: 'Banana', total: '15', id: '22'},
      ],
      [
        { name: 'Apple',  total: '5', id: '1'},
        { name: 'Banana', total: '10', id: '22'},
      ],
    ]
    
    let result = Object.values(arr.flat().reduce((acc, item)=>{
        if(!acc[item.name]){
            acc[item.name] = {...item};
        }else{
            acc[item.name].total = `${+acc[item.name].total + +item.total}`;
        }
        return acc;
    },{}));
    
    console.log(result)
    Ответ написан
    Комментировать
  • Туплю в решении вроде бы простой задачи?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Как вам уже объяснили, ошибка тут
    if (i % j !== 0){ //тут
        b+=1
     }


    Но так как для вас она не очевидна объясню. Возмем ситуацию когда i=6
    и посмотрим как будет работать в данной ситуации внутренний цикл

    for (let j = 2; j < i; j++) {
          if (i % j !== 0){
            b+=1
          }
        }

    при j = 2 условие не сработает (и это правильно)
    при j = 3 условие не сработает (и это правильно)
    при j = 4 условие сработает (и это НЕ правильно)
    при j = 5 условие сработает (и это НЕ правильно)

    итого ваш алгоритм аж 2 раза посчитает что число 6 простое

    думаю теперь вам станет понятней в чем ошибка и вы отметите ответы от ThunderCat и Олег как верные))))

    ну и от себя добавлю - замените внутренний цикл на такой
    for (let j = 2; j <= i/2; j++){
    это в 2 раза уменьшит количество циклов. Почему это правильно предлагаю подумать самому))))
    Ответ написан
    8 комментариев
  • Как эффективно хранить canvas попискельно в БД с последующим отображением?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Я сделал бы несколько иначе, сохранял в бд примерное следующее:

    1. кто, когда и как рисовал
    userID - идентификатор пользователя
    timeStamp - временная метка
    point - координата мышки

    2. информация о смене инструмента рисования (кисточки) и настроек инструмента
    userID - идентификатор пользователя
    timeStamp - временная метка
    toolType - тип инструмента (кисточки)
    toolSettings - JSON строка с параметрами инструмента(цвет, размер и т.д.) (у разных кисточек могут быть свои, уникальные наборы параметров, поэтому систематизировать не выйдет, и поэтому JSON строка)

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

    ЗЫ: от себя добавлю, что для этой задачи в том виде как ее описал я больше подойдут noSQL базы, в которых можно будет обойтись одной коллекцией и несколькими типами записей:

    1. запись о смене инструмента
    {"action": "changeTool",  userID: "xxxxxxx",  timeStamp: 0000000000000, toolType:"pen"}


    2. запись об изменении параметров инструмента
    {"action": "changeToolSettings",  userID: "xxxxxxx",  timeStamp: 0000000000000, setings: {
        тут у каждого инструмента что-то свое, общими наверно будут только цвет и размер
    }}


    3. запись об пути мазюкания инструментом
    {"action": "path",  userID: "xxxxxxx", path:[
        {timeStamp: 0000000000000, "x": 0, "y": 0},
        {timeStamp: 0000000000000, "x": 0, "y": 0},
        {timeStamp: 0000000000000, "x": 0, "y": 0},
        {timeStamp: 0000000000000, "x": 0, "y": 0},
        ....
    ]}
    Ответ написан
  • Почему выдает ошибку?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    прочтите внимательно код ошибки и свой код

    Ошибка: (node:25288) UnhandledPromiseRejectionWarning: TypeError:  db.get is not a function

    переводится как: .... db.get не является функцией

    Смотрим дальше:
    let db = require('sqlite') // для примера использую простой в использовании пакет БД "quick.db"

    странно, но пишите про quick.db а подключаете sqlite
    но возможно я не прав и так и должно быть (никогда не использовал ни то ни другое)?

    Смотрю использование sqlite и вижу что инициализация модуля и создание коннекта к ДБ делаются совсем иначе.

    Смотрю quick.db и вижу в примерах так нужные вам db.get() и db.set()

    Вопрос решен!!!

    Ну и напоследок. Либо вы очень устали и стали невнимательны, либо вам нужно срочно приучить себя вчитываться в текст ошибок, и пытаться понять о чем идет речь, а так же подтягивать знание JS, чтобы такие вот ошибки TypeError: db.get is not a function моментально направляли ваши мысли в нужное русло

    const db = require('quick.db');
    Ответ написан
    2 комментария
  • К каждому новому ID - добавляем +1 от предыдущего?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    class NewElement {
      constructor(selector, classes, id, options) {
        NewElement.counter = NewElement.counter || 0;
        let counter = ++NewElement.counter;
        ...
    }
    Ответ написан
    2 комментария
  • Почему он выводят числа до 4 вместо 5?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    посмотрите разницу между

    x++
    и
    ++x

    https://developer.mozilla.org/en-US/docs/Web/JavaS...
    Ответ написан
    Комментировать
  • Почему в блендере не отображаются restriction toggles?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    в 2.9.x точно так же как и d 2.8.x
    вот, смотрите

    61f566ea71e09130061433.png

    61f566fe127dd927047868.png
    Ответ написан
  • Почему анимация через функцию не плавная?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    setTimeout не дает точного запуска функции через указанное количество миллисекунд,
    поэтому для анимаций, вместо setTimeout используйте window.requestAnimationFrame;

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

    Ответ написан
    2 комментария
  • Как работает ray casting на примере квадрата?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    вот пример, сделанный как раз на трассировке лучей

    5fea7f268ea1d386247037.png

    это все делалось в рамках этого вопроса https://qna.habr.com/q/911259. Код без комментариев, но думаю вы разберетесь
    Ответ написан
    Комментировать
  • Почему не завершается процесс?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    По существу вашего вопроса:

    Как вы думаете, если на телефоне вы набрали номер, а с той стороны была поднята трубка, то когда завершиться звонок?

    если еще не догадались

    звонок завершиться не раньше чем вы или тот кому вы звоните повесит трубку. Поэтому погуглите
    redis client.quit

    и
    redis client.end

    ну или почитайте тут

    ну и напоследок напомню, что иногда полезно читать документацию https://www.npmjs.com/package/redis
    Ответ написан
    2 комментария
  • По какому принципу этот аргумент передается в функцию?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    filter(
       arr,  // первый аргумент - array (объект(не массив) с фильтруемыми вложенными объектами)
       a => a.name == "Adam" // второй аргумент -  test (функция)
    )


    в результате внутри
    function filter(array, test) { ... }

    аргументом test станет переданная стрелочная функция, как если бы мы написали:
    const test = (a) => {
       return a.name == "Adam" 
    }


    для понимания приведу почти аналог этой функции в обычной нотации
    function test(a){
       return a.name == "Adam"  // стравнивает a.name со строкой "Adam", возвращаетекгу true равны и false если не равны
    }


    далее:
    if (test(element)) {            // проверяем равен ли name элемента строке "Adam"
          result.push(element); // если равен, то добавляем в результирующий массив
    }
    Ответ написан
    1 комментарий
  • JS регулярные выражение как отформатировать правильно html?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    На регулярках это можно сделать примерно так:



    НО мой вам совет, никогда так не делайте!!!

    Для таких вещей уже давно придуман более верный способ, обычно заключающийся в следующей последовательности
    1. токенизация
    2. обработка токенов (замены/преобразования и прочее)
    3. сборка результата

    В общим гуглите парсинг и токенизация текстов в общем и html в частности
    Ответ написан
    4 комментария
  • 2Д персонажи и анимация для игр?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Как вариант можно самих персонажей (концепты и шкурку) заказать у художников (например тут https://www.artstation.com/channels/character_anim...)

    А собрать персонажа и настроить его анимации в специально созданной для этого программе spine - двухмерная анимация для игр.

    Посмотреть ее возможности можно в официальном ролике на ютубе https://youtu.be/5RTkImAOJKM
    Ответ написан
    3 комментария
  • Каковы примерные лимиты сообщений в Телеграме?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    на страничке https://limits.tginfo.me/ru-RU публикуются актуальные лимиты на все возможности телеграма
    Ответ написан
    Комментировать
  • Как получить именования месяцев на ру с использованием Moment?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Качаете movent.js с локалями https://momentjs.com/downloads/moment-with-locales.js
    Подключаете его к вашему проекту
    Ну а далее меняем локаль по умолчанию

    moment.locale('ru');
    // далее везде все что качается рабты момента будет по русски
    let month = moment().format('ddd MMMM DD YYYY'); // дата на русском


    пример на jsfiddle
    jsfiddle.net/qcsae231
    Ответ написан
    Комментировать
  • Как сделать google chart на всю ширину?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    chartArea: {width: '90%', height: '80%'},
    Ответ написан
  • Как добавить текст и картинку в inline режим (aiogram)?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Если у вас нет доступа к сайту по вбитой в сообщении ссылке то никак.

    613eabf391246464896824.png
    Данную информацию к отображению добавляет не бот, это делает сам клиент телеграмма, беря информацию прямо с сайта по ссылке. Данная информация указывается на странице сайта с помощью метатегов в хеадере.

    <head>
        ...
        <meta property="og:type" content="website" />
        <meta property="og:url" content="https://www.detmir.ru" />
        <meta property="og:title"
            content="Интернет магазин детских товаров и игрушек в Москве, игрушки и товары для детей в интернет магазине Детский Мир" />
        <meta property="og:description"
            content="Интернет-магазин «Детский Мир» предлагает купить товары и игрушки для детей по выгодной цене. В нашем каталоге Вы можете выбрать и заказать детские товары и игрушки с доставкой по Москве, Санкт-Петербургу, Новосибирску и другим городам России." />
        <meta property="og:image" content="https://go.detmir.st/img/96f25dcdeb082e67509489b08990ae0a.png" />
        <meta name="google-site-verification" content="H12mlaR4ux4mUKnx_ECZzODISfpLd6wlgAZVM5XZSYU" />
        <link rel="image_src" href="https://go.detmir.st/img/96f25dcdeb082e67509489b08990ae0a.png" />
    ...
    </head>
    Ответ написан