Задать вопрос
  • Как оптимизировать и сократить код?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Описаны последовательные отрезки якобы непрерывного диапазона. Косяк в том, что для значений между, скажем, 120 и 120.001, условия не определены и код даст ошибку, т.к. не определится одна из переменных.

    Поэтому лучше цепочка else if. Поскольку они перемножаются и по умолчанию единицы, можно сразу определять конечное значение:

    if (floors.value == 1) {
    
      aF = 1; // по умолчанию, для больше 300
      
      if (area.value <= 120) aF = 1.26;
      else if (area.value <= 140) aF = 1.24;
      else if (area.value <= 160) aF = 1.23;
      else if (area.value <= 200) aF = 1.22;
      else if (area.value <= 260) aF = 1.2;
      else if (area.value <= 300) aF = 1.19;
    
      console.log(aF);
      
    } else if (floors.value == 2 || floors.value == 3) {
      
      bF = 1; // ? для меньше 100 .. и больше 300
      
      if (area.value >= 100 && area.value <= 130) bF = 1.3;
      else if (area.value <= 160) bF = 1.27;
      else if (area.value <= 200) bF = 1.24;
      else if (area.value <= 300) bF = 1.22;
    
      console.log(bF);
    
    }
    Ответ написан
    Комментировать
  • Как обнулить таймер при достижении 31?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В датах JavaScript, так уж повелось, месяца считаются от 0 (январь) до 11 (декабрь), в то время, как годы и даты (дни месяца) считаются по-человечески, как пишутся.

    Это и удобно, когда делаете массив с именами для месяцев, не нужно пустой элемент в начале укладывать. Просто:
    const monthNames = 'января февраля марта апреля мая июня июля августа сентября октября ноября декабря'
      .split(' '); // получится массив
    const D = new Date(); // объект Даты на сейчас
    
    // завтрашний день
    D.setDate( D.getDate() + 1); // так месяц "переключится" автомагически
    console.log( 'Завтра ' + D.getDate() + ' ' + monthNames[ D.getMonth() ] );
    Ответ написан
    Комментировать
  • Как проверить GET запрос?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно проверять свойства элемента complete и после него naturalWidth (или naturalHeight) через какое-то время после назначения src – достаточное для загрузки картинки. Проверка того, есть ли картинка, в любом случае немгновенна, асихнонна.

    const srcs = [
        'https://sun6-5.userapi.com/c850632/v850632804/12d149/KnY01pJH16w.jpg'
        ,'https://sun6-6.userapi.com/c855020/v855020551/59a81/phM3k4nXcrg.jpg'
      ];
      
      function makeCheck(image) {
        return function() {
          if (image.complete  &&  image.naturalWidth) {
            console.log("картинка загрузилась ОК!");
          } else {
            console.error("Нет такой картинки: " + image.src);
          }
        }
      }
      
      for(let i = 0;i < srcs.length; i++) {
        const src = srcs[i];
        const image = new Image();
        window.setTimeout( makeCheck(image), 300);
    
    //image.src = "../img/designers/" + index + '.' + id + ".jpg";
        image.src = src;
      }
    Ответ написан
    Комментировать
  • Как сделать, чтобы вложенная окружность убегала от курсора?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Чтобы пример заработал, надо в Settings - JavaScript - включить препроцессор Babel.

    По событию движения мыши, надо кругу давать координаты самой дальней точки у окружности. Для этого понадобится вектор от курсора к центру. И продлить его на радиус.

    Примерно так:


    По-хорошему, наверное, надо после первого же движения мышки "прилеплять" круг к противоположной стенке, и дальнейшие движения делать скользящими по окружности, т.к. нет сил, способных отодрать шарик от стенки.
    Ответ написан
  • Возможно ли файлы сайта упаковать в .exe'шник?

    В один exe'шник не получится: даже если обернуть всё, скажем, в Electron, будет несколько файлов и друзьям придётся задуматься, какой тыкать. Кроме того, зоопарк платформ и версий: кто-то на старой винде, кто-то на планшете с Android, а у кого-то iMac.

    Понтоваться надо по полной: зарегистрировать домен, хостинг и поднять сайт там, а друзьям скинуть адрес.
    Почём?
    • домен CyberWErewolf.ru свободен, регистрация на reg ru стоит 199 рублей на год
    • хостинг - т.к. сайт статичный, можно разместить на Amazon S3 за какие-то центы

    После прохождения этого квеста ваши скиллы заметно вырастут.

    Ну, или запишите видео.
    Ответ написан
    Комментировать
  • Как посчитать сколько раз цифра повторяется в числе?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно без регулярных выражений, которые под капотом нелегки, старым добрым indexOf() в лоб. Костыль только для двух повторов, но, по идее, быстрее регулярок:

    function haz2ones(str) {
        const s = str.toString();
        const search = '1';
    
        let i = s.indexOf(search);
        if (!~i) return false;
    
        i = s.indexOf(search, i + 1);
        if (!i) return false;
        if (!!~s.indexOf(search, i + 1)) return false;
        return true;
      }

    Тесты
    const tests = [
        [1, false],
        [11, true],
        [111, false],
        ['1', false],
        ['11', true],
        ['111', false],
        ['100001', true],
        ['000011', true],
        [12345678901234567890, true],
      ];
      
      return tests.map(e => haz2ones(e[0]) === e[1] ? '+' : '- ' + e[0]);
      // +,+,+,+,+,+,+,+,+
    Ответ написан
    Комментировать
  • С чего начать изучать game dev?

    Порекомендую движок Corona на основе языка Lua с документацией на Русском языке. Бесплатный, кросплатформенный и всё такое.
    Ответ написан
    Комментировать
  • Как передавать данные с различных датчиков?

    Даже без паяльника можно собрать искомое. Недавно я присоединился к проекту мониторинга качества воздуха Москвы (карта с датчиками) – собрал и установил за окном датчик, в т.ч. DHT22 (температуры и влажности).

    Заказывал компоненты на Али и собирал, прошивал по этой инструкции. И прошивка, про которую пишут в инструкции, умеет отсылать данные в т.ч. на собственный URL:
    5ceac76f35eae792636693.png

    Вы можете забить на самый дорогой компонент, датчик частиц PM10 и PM2.5, всё будет работать и без него. В основе используется уже рекомендованный в другом ответе NodeMCU ESP8266 - типа Arduino с WiFi.
    Ответ написан
    Комментировать
  • На сколько опасно подключать домашний ПК к интернету на прямую (без роутера)?

    Разница может быть в соединениях инициированных снаружи.

    по умолчанию:
    • Комп за роутером принимает соединения извне только по портам, явно указанным в конфиге роутера. И по умолчанию не указан ни один.
    • Комп напрямую слушает по всем портам, на которых работают службы, расчитанные в т.ч. на локальную сеть.


    Т.о. с конфигами по умолчанию безопаснее сидеть за роутером, т.к. он срезает часть потенциальных атак.

    Если же пользователь опытный, он в состоянии качнуть ситуацию. Причём в любую из сторон )
    Ответ написан
    2 комментария
  • Через какую программу можно быстро разделить видео на две части?

    По времени разделить можно ffmpeg'ом. Чтобы быстро, надо без перекодировки. Что-то типа
    ffmpeg -i source.mp4 -t 1:30:00 -c copy part1.mp4
    ffmpeg -ss 1:30:00 -i source.mp4 -c copy part2.mp4

    Это разделит видео на отметке 1 час 30 минут и сделает два файла part1 и part2
    Ответ написан
    2 комментария
  • Можно ли как-то внедрить Алису от Yandex к себе на сайт?

    Посмотрите Яндекс.Диалоги
    Ответ написан
    Комментировать
  • Можно-ли скачать видео с YouTube используя DevTools?

    Есть такая «секретная» ссылка: www.youtube.com/get_video_info?video_id=XXXXXX
    Вместо XXXXXX подставьте хэш видео, который в ссылке на ролик, типа youtu.be/BWCiWZtrWXU после слеша.

    По этой (первой) ссылке вернутся URL-encoded данные. Распакуйте их и возьмите параметр url_encoded_fmt_stream_map. Его значение опять надо распаковать как URL-параметры. И из результата вытащить параметр url – это ссылка на единый скачивабельный видеофайл.

    Например, в консоли браузера:
    function getUrlParams(search) {
        let hashes = search.slice(search.indexOf('?') + 1).split('&')
        let params = {}
        hashes.map(hash => {
            let [key, val] = hash.split('=')
            params[key] = decodeURIComponent(val)
        })
    
        return params
    }
    var s = '------'; // здесь длиннющая строка из ответа /get_video_info
    var a = getUrlParams(s);
    var b = getUrlParams(a.url_encoded_fmt_stream_map);
    console.log(b.url); // эту ссылку открываем в браузере - это скачиваемый видеофайл


    Очень надеюсь, что вы покопаетесь в этих данных более подробно, разберётесь, как получать прямые ссылки на скачиваемые файлы во всех форматах и размерах, которые предлагает YouTube, и напишете короткий материал на Хабр по результатам, а также опубликуете gist с рабочим кодом для консоли браузера.
    Ответ написан
    3 комментария
  • JQuery. Как добавить недостающий класс?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    просто добавить класс addClass() последнему элементу :last-child

    $('.parent div:last-child').addClass('div2');
    Ответ написан
  • Является ли данный пример замыканием и почему ДА или НЕТ?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Mozilla определяет замыкания так:
    Замыкание — это комбинация функции и лексического окружения, в котором эта функция была определена.
    A closure is the combination of a function and the lexical environment within which that function was declared.

    Если эти вводные описания посчитать за «правильные» определения, то формально «ДА», является, хоть и вырожденным. В вашем примере это окружение совпадает с глобальным, поэтому ни о какой имитации приватных методов и свойств тут речи не идёт.

    Чтобы сделать кошерное замыкание надо как следует обернуть сей код, чтобы в приватность его переменных никто извне не мог добраться:
    function makeCounter() {
      // далее ваш код:
      let count = 0;
      function counter() {
        return count += 1;
      }
      // конец вашего кода.
    
      return counter; // вернули Функцию (с её окружением)
    }
    
    var myCounter = makeCounter();
    // вот теперь к значению count не добраться - приватность!
    // зато
    console.log(myCounter()); // 1
    console.log(myCounter()); // 2
    console.log(myCounter()); // 3
    Ответ написан
    6 комментариев
  • Как создать циклическую анимацию на js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Может, лучше без JS сделать средствами CSS?
    @keyframes swing {
      0% {transform: rotate(-15deg)}
      50% {transform: rotate(15deg)}
      100% {transform: rotate(-15deg)}
    }


    Ответ написан
    3 комментария
  • Арифметическое отнимание напрямую в MySQL или передавать с бэка число?

    1-й вариант лучше, т.к. требует на 1 запрос меньше: не приходится сначала запрашивать текущий баланс.
    Но этот плюс исчезает, если вам в этом же коде требуется получить новый баланс юзера — тогда оба варианта эквивалентны.

    3-й вариант: только-вставлять в ещё одну таблицу новые записи о Событиях. Событие "+10" для user_id=X, затем новая запись "-10" для user_id=Y. И чтобы получить актуальный баланс юзера, вы собираете все его События и суммируете. Раз в месяц уплотняете базу, выкидывая События и обновляя «базовый» баланс для каждого юзера.
    Ответ написан
  • Какой может быть алгоритм заполнения матрицы?

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    У вас же простой тетрис! ) Только вверх-ногами.

    Берёте случайную фигуру и пытаетесь её поставить так, чтобы она заняла клетки в самом верхнем ряду-с-дырками. Если это невозможно, случайно выбираете ещё раз из фигур шириной 1 (1x1, 1x2).

    Всё.
    Ответ написан
  • Как называется markdown редактор на JavaScript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Не 1:1, но поробуйте Editor.js (github, сайт)
    Ответ написан
    1 комментарий
  • Хочу изучать машинное обучение и робототехнику. Какие языки программирования я должен изучить?

    Продолжайте Python. Попробуйте раздобыть плату NVidia Jetson Nano и собрать с ней проект JetBot
    Ответ написан
    Комментировать
  • Можно ли взять бесплатный VPS для совместной работы?

    Можно попробовать получить программу поддержки стартапов, скажем, от Microsoft. На год или несколько дадут возможность пользоваться Azure, в подписку включена ежемесячная сумма, достаточная для неслабого сервера с Windows. Лицензия Adobe'овских продуктов туда не входит.

    Поищите такого же плана программы от других крупных игроков: IBM / SoftLayer, Google, игровых студий.
    Ответ написан