Ответы пользователя по тегу JavaScript
  • Как сохранять клики и их время в кликере?

    @rPman
    вместо условных 100 кликов людям засчитывало ~40
    судя по sql у тебя количество сохраняемых кликов считается как сначала запросом получить текущее значение, затем сохранить его увеличенным... что естественно неправильно обсчитывается, если одновременно на бакэнд идут несколько запросов, и завершаются в разном порядке (т.е. первый, получил значение 1, затем его обогнал второй, получил то же значение 1, оба отправляют +1 значение, т.е. 2, вместо ожидаемого 3.

    Правильно: одним обновлением в базе нужно - проверять допустимость клика (проверить время последнего клика), обновить время последнего клика и увеличить количество кликов на 1... после чего бакэнд проверяет, сколько записей было обновлено, если 0 - значить выход за лимиты, если 1 - все ок.
    update set clicks=clicks+1, last_click_time=now() where last_click_time+:ALLOWED_CLICK_INTERVAL<now() and id=:current_id


    p.s. даже очень слабая машина позволит делать сотню запросов в секунду на обновление, а хорошая - десяток тысяч

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

    @rPman
    Значит это не Array а объект, и length тебе считает вот это свойство length
    Потому что вот это будет равно 0 как и ожидается
    JSON.parse('[]').length
    Ответ написан
  • Компилируемый ЯП в стилистике JS есть?

    @rPman
    Использую очень давно php для локальных скриптов, у него самый немногословный синтаксис именно для работы с файлами (или к примеру запуск команды это написать ее в обратных ковычках $a=`ps -ax`;), это самый быстрый в исполнении язык программирования, даже и интерпретируемый, рядом с ним javascript но с оговорками (например использовать map вместо массивов), все остальные рядом не стояли. А благодаря огромной базе решений в composer задачи можно решать и по сложнее.

    Если что python тоже хорош, и стал чуть ли не стандартом в мире linux, и синтаксически так же не многословен, а уж решений в pypi базе там наибольшее из всех существующих... лично мне не очень нравится как язык, а еще он самый медленный поисполнению из всех (его скорость - в готовых решениях, оптимизированных и написанных на c++)

    Интересно и то что установить php можно практически куда угодно (извиняюсь, не нашел для KolibriOS - это был сарказм), у него наименьшие требования к скилам и версиям ос, на windows штатно распространяется просто zip-чиком, а на linux не найти репозитарий нужной версии еще нужно постараться, да и если нет, при некотором рукошевелении он так же устанавливается в каталог пользователя, требований к самой ос у него очень мало.

    p.s. если вопрос про windows, то с ним уже давно в стандарте идет .net sdk (4 версии) а установить можно 6-ую версию. sdk это компилятор c#/js#/vb#, exe-шник будет в пару килобайт, для создания приложения достаточно текстового редактора. c# лично мне не нравится в задачах скриптописания из-за многословности но как язык разработки это отличный вариант, строгость типизации, все лучшее из мира java... но в скорости исполнения он заметно отстает от php/js (сейчас набегут хейтеры и скажут что вы все врете..)
    Ответ написан
  • Как в JS реализовывается механизм синхронизации множественных параллельных запросов?

    @rPman
    Ты делаешь метод выполнения 'следующего запроса' (он будет смотреть список задач и исполнять первый не выполненный, либо вернет - все закончилось) асинхронным async function do_next()..., и в цикле просто вызываешь этот метод await do_next() пока не вернется все закончилось, параллельно можно запустить таймер таймаута, который завершит все невыполненное.
    Ответ написан
  • Как найти букву, которая не является частью слова?

    @rPman
    т.е. слева и справа от буквы должен быть пробел, либо знак препинания, либо начало, либо конец строки? В такой формулировке сам поймешь как сделать?

    p.s. еще есть \b - граница слова, любая буква \w тогда регулярка /\b\w\b/
    Ответ написан
    5 комментариев
  • Как сделать просмотр ютуба при выключенном экране смартфона на js?

    @rPman
    firefox, приватная вкладка, вид для ПК, оригинальный youtube работает при заблокированном устройстве (иногда требуется сменить вкладку на другую перед блокировкой, закономерности не выявил).

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

    ну и https://wiki.mozilla.org/Mobile/GeckoView
    Ответ написан
    Комментировать
  • Как лучше сделать переключение языков на многостр. сайте?(без бэка)?

    @rPman
    Модифицируй роутер или mod rewrite веб сервера таким образом, чтобы идентификатор выбранного языка был в ссылке (например my.site.com/fr/blablabla ), при отсутствии этого идентификатора проводи проверку по заголовку (например для apache, главное идея). Это позволит в интерфейсе дать пользователю выбор языка и одновременно без этого выбора делать его автоматически.

    да, перевод нужно размещать поэлементным и прописывать в своем json.

    Так же есть сервисы типа гугла или yandex, устанавливаются на сайт и делают автоматический перевод (не рекомендую)
    Ответ написан
    7 комментариев
  • Как скачать защищенный от скачивания PDF-файл с сайта?

    @rPman
    Скопировать через буфер можно только неформатированный текст и только текущие +-10 страниц (вручную можно но долго и нудно, потом сшивать).
    1. Реверсить их вьювер долго и дорого.
    2. Скринить странички - для личного использования подойдет (набор картинок, соединить в pdf и читать не проблема, но железные слабые читалки могут такие не прожевать), сделать не программисту можно с помощью любой автоматизации, например autoit. Логика следующая - открываешь нужный сайт в максимальном размере на полный экран (полный экран и настроить По ширине страницы), затем продумываешь свои действия (мышь/клавиатура) такими, чтобы если их повторять, копировалось все содержимое без пропусков и повторов, в данном случае это кнопка PageDown и копирование экрана (можно по количеству страниц посчитать сколько это будет действий)

    В коде autoit это будет for loop
    For $i = 1 To 100500
    ...
    Next


    шлешь нажатие кнопки
    Send('{PGDN}')

    ждешь секунду (там примерно каждые 10 страниц генерация и удаление старых) sleep

    делаешь скрин с экрана
    _ScreenCapture_Capture(StringFormat('%09i', $i) & '.png', 0, 0, @DesktopWidth, @DesktopHeight, False)

    нужно подобрать размеры чтобы лишнее не копировать
    StringFormat тут добавляет к номеру слева нули, чтобы при сшивании порядок не был 1 -> 11 -> 2 -> 3....

    по итогу работы получишь тысячу картинок, объединяешь их с помощью imagemagic
    magick *.png out.pdf

    3. способ - их pdf просмотрщик генерирует валидный html для текста (с картинками сложнее),
    css selector
    $('#pageContainer2 > .textLayer').innerHTML
    тут номер у pageContainer это номер страницы, но в один момент времени заполнены текстом только текущие видимые +- поэтому код нужно будет написать, чтобы корректно в нужный момент времени читать нужные

    Можно конечно заморочиться и запилить selenium приложение которое будет листать странички и собирать html-ку, можно в полуручном режиме прямо в браузере в консоли написать пару строчек, собирая текст в localStorage (он ограничен 5-мб кажется). html код там прямо такой (по кускам текста как они были в pdf)
    Кликать на следующую страничку - $('#next').click()

    <div style="left: 83.5342px; top: 384.732px; font-size: 20.5963px; font-family: serif; transform: scaleX(0.793798);" data-canvas-width="404.5723586629188">Стенограмма  Нюрнбергского  процесса.  Том </div>

    т.е. останется только стили добавить или скопировать их с сайта и готовая отформатированная html будет готова
    Ответ написан
    Комментировать
  • Скачать все видео автора тик ток?

    @rPman
    Видео отлично качает консольная утилита yt-dlp (устанавливать в linux из pip install в windows с офф githubоно же умеет качать и видео пользователя но именно с тикток это сейчас сломано (само собой тикток борется с качальщиками), я не пробовал самый последний релиз возможно пофиксили, попробуй)

    Еще момент, с российских ip тикток кастрирует и ломает выдачу, скрывает популярных авторов в т.ч. из поиска (вот пример @wannabeteacher поищи как пример), поэтому подбирай локацию хостинга скриптов.

    p.s. у тикток есть api, просто разберись с ним и используй
    https://developers.tiktok.com/doc/tiktok-api-v1-vi...
    Ответ написан
    2 комментария
  • Как ограничить доступ к странице сайта на устройстве пк браузеров?

    @rPman
    Открывамем гугл, пишем github browser mobile detector
    получаем ссылку на почти сотню проектов, отсортированных по популярности, первый какраз на php
    Ответ написан
    Комментировать
  • Какую технологию использовать для проигрывания видео в браузере с ручной подгрузкой байтов?

    @rPman
    Когда то давно я открывал два плеера (друг над другом один скрыт другой виден), загружал в оба плеера видеофайлы, ставил на паузу (особенность, если просто указать видео в режиме паузы оно не загружается, загрузка начинается в момент проигрывания, но это было давно может уже поменялось что, советую просто проверить), и затем по мере окончания проигрывания одного, я скрывал его, делал видимым второе видео и отключал паузу в нем.... причем паузу можно отключать на доли секунды заранее, подруливая громкостью, делать плавный переход от одного к другому.

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

    p.s. вполне возможно что сейчас лучше/удобнее формировать .m3u8 плейлист, javascript там продвинутый у html video, но если что его можно формировать и прописывать с помощью data uri.
    Ответ написан
    Комментировать
  • Как максимально быстро кликнуть на элемент в браузере?

    @rPman
    Необходимо реверсинженерингом выявить способ, которым события доходят до клиента.

    Для начала открой консоль разработчика (f12) и зайди на вкладку networks
    - если там будут периодические события (например с секундным интервалом) по названию (в url или еще как) похожие на получение статуса, то это значит используется медленный метод http get (это значит клиент получает информацию о событии со случайной задержкой порядка этой секунды), значит дальше можно искать в коде способ как чаще делать запросы (обычно это вызов метода по setTimeout его можно тупо повторить из консоли руками).
    - если там будет подключение типа websocket, тогда странно, обычно это самый оперативный метод, но бывает что бакэнд писали странные люди (или их поставили в странные условия) и там события обрабатываются линейно что то типа 'sleep;читаем базу;отправляем на клиента' то тогда достаточно открыть одновременно несколько окон браузера к одной и той же страничке, и с некоторыми шансами получишь на каждого клиента по циклу со sleep а значит со своей случайной задержкой (она зависит от интервала между открытиями страниц) а значит какая то страница получит обновление статуса раньше с вероятностью тем выше чем больше страниц.

    Я привел пример простых методов, которые потребуют минимальное программирование, но мало ли как там в реальности все сделано, для этого и нужен реверсинженеринг.

    По правильному можно разобраться как все работает и на javascript написать максимально эффективное приложение (прямо тут же в консоли браузера) по опросу сервера.
    Ответ написан
  • Создание бота для Android игр, как?

    @rPman
    Формально исследователи ИИ научили играть компьютер а условный Майнкрафт исключительно по видео, так же бот успешно играл в аркады типа Марио и прочее.

    Если ты готов отвалить за результат несколько десятков миллионов $, то дерзай, обращайся в Гугл или openai.

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

    @rPman
    slow = cachingDecorator(slow);после этого slow у тебя уже не прошлая функция а целый класс, в котром прописан вызов старой функции при условии отсутствии данных в кеше (объект в этом классе)

    Заметь, slow без скобок это не вызов функции, а получение ее самой (в терминах c++ ее адреса) и передача этой функции в виде аргумента. Чтобы вызвать функцию, даже если ее адрес в переменной, нужно написать скобки
    Ответ написан
  • Парсинг по расписанию и аплоад в БД?

    @rPman
    Тебе нужен критерий, как отличать старые записи (дубликаты или не изменившиеся, тебе виднее что там) от новых.

    Если удобного идентификатора нет, то обычно самое простое, - формировать из сравниваемых данных строку одинаковым способом, и получать из нее хеш сумму (md5 более чем подходит, если данных не 16-значное количество, т.е. не нужно заботиться о коллизиях), его и используй как идентификатор и храни где-то списком как предыдущие значения и сравнивай с ново загруженной, прямо во время анализа. Записи, хеш сумма которых, не была найдена в записях, помещай в базу данных (ну или обновляй значения, если речь идет о модификации а не добавлении новых).
    Ответ написан
    Комментировать
  • Как редактировать контент сайта человеку не знающему HTML (без конструкторов)?

    @rPman
    Тебе нужна 'система управления к содержимым' (content management system), в общем случае это программа которая из текста делает html, и делает это в удобном и понятном виде.

    Либо ты пользуешься готовыми системами типа конструкторов сайтов и новыми cms типа древнего wordpress, либо пишешь его сам
    Ответ написан
    4 комментария
  • Почему аргументы принимаются именно в таком порядке?

    @rPman
    потому что apply(this_объекта, array_аргументы)

    наоборот ты передал вместо объекта массив ['Hello'] это не твой объект с name, а с объектом уже не работает ${...} и тоже вернет undefined
    Ответ написан
    Комментировать
  • Как сделать распределение по процентам, чем дороже цена тем меньше шансов?

    @rPman
    Все зависит от того, будешь ли ты проводить такие розыгрыши часто или это однократная операция. А так же, готов ли ты к серии неудач для тебя (т.е. будет ли случайное число честным для участников розыгрыша).

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

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

    Поэтому большинство розыгрышей делают не честным (например игровые автоматы), с целью убрать серию убыточных для организатора выигрышей, например выставляя условие, если общая сумма выигрышей прошедших розыгрышей выше некоторого лимита, то дорогие выигрыши исключаются из следующего розыгрыша. Так же как частный случай, можно заранее провести розыгрыши некоторого количества призов и если их сумма не превышает лимита, сохранить их список или сохранить стартовый seed генератора случайных чисел, чтобы иметь гарантии. У второго подхода есть уязвимость, сотрудники компании, имеющие доступ к этим сохраненным результатам, могут их использовать для повышения своих шансов на выигрыш, фактически грабя остальных участников.
    Ответ написан
  • Почему при изменении объекта он не меняется в массиве?

    @rPman
    проводи эксперименты дальше, например obj.name="asd" изменит объект в массиве arr

    переменная obj содержит не сам объект а ссылку на него, точно так же ссылку на него помещаешь в arr[0]

    объект должен умереть автоматически если его ссылку никто не сохранит

    p.s. за отсутствие многих вещей по контролю над объектами мне javascript и не нравится, с другой стороны меньше возможностей выстрелить в ногу
    Ответ написан
    Комментировать
  • Как реализовать множественную фильтрацию карточек товаров по нажатию на несколько переключателей?

    @rPman
    Выводишь все карточки на php, но в style корневого div-а каждой ставишь им display:none, а скриптом на js в зависимости от фильтра пробегаешь по всем корневым div-ам каждой карточки и включаешь их отображение display:inline (тогда карточки будут располагаться друг за другом), можешь использовать display:block тогда один над другим будет (там еще от float зависит)

    Работа с элементами на javascript зависит от выбранного фреймворка, например в jquery ты можешь написать $('.имя_класса').each(function(){...}), а чтобы удобнее было фильтровать, заранее на php добавь каждому корневому тегу атрибуты со значениями по которым будешь проводить фильтрацию, например атрибут category а значения Шведский стол, другой атрибут curency а значения usd/rub/... тогда выбирая в фильтре значения в функции erach просто проверяешь сравниваешь значения атрибутов с выбранными на форме и соответственно включаешь и выключаешь их.

    Этот подход наиболее простой, для тех кто большую работу по формированию страницы делает на php но хочет внести в логику страницы больше динамики на основе javascript. Недостаток - клиент получает вне зависимости от выбранного фильтра полный список карточек, и если их много, лучше реализовать другой способ...

    Если формировать карточки на javascript, размер данных, передаваемых с сервера будет в несколько раз меньше, так как описание карточки занимает значительно меньше места в сетевом трафике чем готовых html (с оговорками, если включено сжатие страницы на сервере, то разница в размерах будет уже не такой значимой)
    Ответ написан
    Комментировать