• Как отследить закрытие PWA?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В случае убийства, PWA ничего не успеет сделать. С таким же успехом можно буквально прострелить телефон огнестрельным оружием или бросить в кислоту.

    Просто найдите сбалансированную цифру, сколько держать сессию. Зависит от цены создания и поддержания сессии.

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

    И ещё более умный вариант - как-то отслеживать (условно) "характер" пользователя. Например, если зашёл и закрыл, то сессия удаляется довольно быстро. А если вернулся через час, или на следующий день, то перевести пользователя в статус "активный", и для него вообще таймаут можно на пару дней поставить. Ну, опять же, в случае высокой цены создания сессии. Честно говоря, мне сложно представить задачу, где цена настолько высока, чтобы так заморачиваться.
    Ответ написан
    Комментировать
  • Как заставить нормально работать динамически подключенный js код?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    var jq = document.createElement('script');
    jq.src = "js/jquery-3.3.1.min.js";
    document.querySelector('body').appendChild(jq);
    
    jq.onload = e => {
        var script = document.createElement('script');
        script.src = "js/scripts.js";
        document.querySelector('body').appendChild(script);
    };
    Ответ написан
  • Как создать строку?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    var str = "<scr"+"ipt></scr"+"ipt>";
    Ответ написан
    Комментировать
  • Как заменить знак звездочки на все символы?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    var str = "test.example.com";
    var pat = "*.example.com";
    
    pat = '^'+pat.replace(/\./g, '\\.').replace(/\*/g,'.*')+'$';
    console.log(!!str.match(pat)); //true
    Ответ написан
    Комментировать
  • Как Telegram Desktop нормально работает из коробки без прокси?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Например, такая нехитрая схема, которая напрашивается первой.

    Пусть у нас есть 1000 прокси в разных частях света.
    Делим всех юзеров РФ на 100 частей и каждой части даём свой прокси.
    Некоторые из этих прокси блокируются, но не все, потому что РКН тогда должен запариться подключением из разных частей.
    Каждую часть юзеров, в которой спалили прокси, мы снова делим на 100 частей и раздаем им свои прокси.
    Таким образом, постепенно вымываем аккаунты и ipшники, с которых РКН ищет прокси.

    Примерно это же касается новых подключений. Новых юзеров пускаем на прокси, которые не жалко, причем частями. Если какая та часть сидит на прокси долго и этот прокси не банится, то юзеров можно перевести на основной прокси.

    В общем, это война пули и брони. Как ты понимаешь, выигрышной стратегии нет. Но придумать можно много чего.
    Ответ написан
    Комментировать
  • Как учить JS и не сойти с ума?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    JS - громоздкий и довольно запутанный язык (исторически так сложилось).
    Основы языка понять - как раз довольно просто. А вот постичь все тонкости, я бы сказал, не просто сложно, а даже не нужно. У разработчика главная цель - чтобы код работал. Оптимизация, как правило, достигается знанием алгоритмов, а это за пределами знания самого языка. Так что как вариант - просто писать то, что вам нужно, и периодически поглядывать в спецификацию, гайды, гугл, тостер. Вот и весь секрет.
    Ответ написан
    Комментировать
  • Как исправить баг в коде?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Точно не уверен, но попробуйте свести алгоритм к таким шагам:
    1. Получение данных.
    2. Их обработка
    3. Отправка результатов в таблицу.

    То есть на третьем шаге не должно быть повторного получения данных. У вас copyTo сразу после setValues. Возможно, всё это дело как-то кешируется, так что getRange всегда берет изначальные данные.
    Ответ написан
  • Какие специальные символы нужно запретить для ввода в Input?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Нужно запретить все символы, кроме символов из белого списка типа a-zA-Z0-9_
    Проверка должна быть на сервере. На клиенте проверка нужна, только чтобы не перегружать страницу лишний раз.
    Ответ написан
    6 комментариев
  • Как превратить объекты со ссылками в JSON?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Дело в том, что в JSON не может быть циклических ссылок по определению. Там даже нет переменных.

    Лучше всего вам перейти на немного другой формат данных. А именно, хранить не ссылки на объекты, а их ключи в виде строк. Такие строки-ссылки спокойно сериализуются.
    leader.soldier = "soldier";
    soldier.leader = "leader";

    Автоматически лучше не конвертировать, а именно взять такой формат за основу. Но если очень хочется, то как-то так:
    for (let key in obj) {
      if (window[key]) obj[key] = key; //любой ваш критерий
    }

    В будущем для проверки, правда, понадобится чуть усложнённый код:
    var test_leader = soldier.leader && window[soldier.leader];
    //Конечно, вместо window у вас будет свой объект-обертка

    Чтобы избавится от этого вам нужно будет всего лишь "чинить" объект после JSON.parse
    Ответ написан
    Комментировать
  • Нужно определиться со структурой неизвестной html страницы?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    var s = 'energy|{"Ts":"380158","Va":"232.00","Aa":"0.37","Pa":"56","PFa":"0.65","T0":"18.94"}|div';
    s = s.split('|');
    s[1] = JSON.parse(s[1]);
    console.log(s);
    console.log(s[1].Va); //232.00

    Соответственно, ссылка для вас будет примерно такая (должно вернуть 232.00):
    javascript:alert((e=>{var s=document.body.innerHTML; s = s.split('|'); s[1] = JSON.parse(s[1]); return s[1].Va})())

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

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Нужно сделать отдельную функцию с помощью Google Script, и использовать её в своей таблице. Тогда в отдельном столбце вы сможете выводить всё, что душе угодно.

    Но проще сделать раскраску элементов в столбце B, которые отсутствуют в столбце A. Такое подойдет? Функция COUNTIF
    Ответ написан
  • Корректный ли ассемблерный код?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В коде не хватает комментариев. Добавьте комментарии с пояснениями, где что означает и где что происходит. Тогда вам же будет проще понять. Даже в языках высокого уровня очень желательно комментировать не очевидный код, а уж ассемблер сам бог велел.
    Ответ написан
  • Как выдернуть _id из структуры список объектов?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    msg.map(e=>e.item._id)
    Ответ написан
    Комментировать
  • Почему функция не объявлена?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Потому что закавыченный код выполняется в глобальной области видимости. Так устроены функции setInterval и setTimeout, увы и ах. Пример:
    function test() {
    	let x = 123;
    	setTimeout("alert(x)",0); // x не видна
    }
    test();

    Если нужна именно строка, то оберните код в функцию eval, она выполняется в локальной области видимости:
    function onload() {
    	function f(){
    		console.log('12');
    	}
    	setInterval(e=>eval("f()"), 1000)
    }
    onload();

    Иначе просто используйте ссылку на саму функцию, то есть f вместо "f()"
    Ответ написан
    9 комментариев
  • Можно ли на JS писать музыку?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Наберите в гугле "piano online".
    Ответ написан
    Комментировать
  • Что может помешать перехватить нажатие?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В другом месте может быть повешен другой обработчик, который монополизирует событие и предотвращает передачу события дальше по цепочке.
    event.preventDefault();
    Ответ написан
    1 комментарий
  • Откуда берется стоимость подключения к интернет?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    За такую цену составьте договор на ваших условиях. Например, каждый час без Интернета, или с низкой скоростью, или плохим качеством - это минус 1000 рублей абонплата вплоть до того, что провайдер вам должен будет. Ну или можно сформулировать абстрактно про убытки, которые потом целиком повесить на провайдера. Вы, в свою очередь, получаете гарантию того, что срыв сделки на миллион долларов оплатит провайдер. Иначе проще через мобилу раздать на офис.
    Ответ написан
  • Как заблокировать доступ к сайту определённому клиенту?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Можно. Всем без исключения пользователям не показывать контент, пока не заработает метрика. Затем можно перевести в куки, но дальше стратегия очевидна. Другой вопрос, устроит ли вас подход, когда сайт блокируется для всех, у кого не работает метрика (например, стоит блокировщик рекламы).
    Ответ написан
    9 комментариев
  • Стоит ли переходить с var на let и const?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Нужно использовать и то, и другое одновременно, в зависимости от обстоятельств.

    Например, если вы используете Google Script, то var, потому что там что-то типа ES5.
    Если шлёте код другу, чтобы он проверил его через консоль браузера, то опять var, потому что если что-то поменяется и надо будет ещё раз проверить, то он запустится без ошибок (о том, что переменная уже объявлена).

    С другой стороны, в одном пространстве (например, внутри функции) вы можете использовать несколько одинаковых переменных с помощью let на разных уровнях, и не бояться конфликтов, в то время как через var будет одна и та же переменная. Пример:
    for(let i=0;i<2;i++)for(let i=0;i<2;i++)console.log(i); //покажет 4 раза
    for(var i=0;i<2;i++)for(var i=0;i<2;i++)console.log(i); //покажет 2 раза

    Каждое имеет свои особенности и удобно по-своему.
    Ответ написан
    9 комментариев
  • Как кто-то смог проникнуть в мой календарь?

    dollar
    @dollar Автор вопроса
    Делай добро и бросай его в воду.
    Пока сделал следующее (как рекомендуют в интернете):
    1. Создал новый календарь
    2. Каждый спам перенёс в новый календарь.
    На этом всё.
    Хотя дальше рекомендуют:
    3. Удалить весь календарь БЕЗ уведомления.

    Если просто так удалять, то это сигнал спамерам, что календарь активный, и зараза будет дальше лезть.
    Но вопрос всё ещё открыт. Ведь это не решение.
    Ответ написан