• С чего начать написание своего софта(парсера)?

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

    Если речь о браузере, то языки - это javascript, html и css.

    Ну и помним про два отличающихся подхода - простой но ресурсоемкий с использованием готового браузера (инжект своего javascript плагином браузера или что то типа selenium) либо сложный но эффективный - симуляция http запросов из своего приложения. Оба подхода на противоположных сторонах, но в конечном счете оба будут использованы, где то один где то другой.

    p.s. сообщество полюбило python и javascript (node), я часто использую php, в т.ч. как часть комплекса, так как на питоне и javascript код получается многословнее. Кому то нравится java или c# (использовал когда можно было браузерный компонент легко в свое приложение вставить)
    Ответ написан
    Комментировать
  • Можно ли в mysql хранить 200 колонок, для 10+млн записей?

    @rPman
    Да, для хранения, добавления и чтения данных с анализом этот подход очень хорош, ценой незначительного для твоих объемов (кратного, Rsa97 все расписал) ты получишь огромный прирост производительности. Настоятельно рекомендую протестировать на тестовом стенде на своих данных, особенность хранения null записей в innodb и работа индесов с ними. Что лучше в твоем случае парный индекс в денормализованной форме или 200 индексов в нормальной можно будет определить только тестами (большая таблица может потребовать больше оперативной памяти на индексы).

    Есть еще недостаток - если в таблице будет очень много данных, добавление и тем более удаление колонки будет проходить очень медленно, особенно если база данных в это время будет использоваться.
    Ответ написан
    1 комментарий
  • Как посчитать количество дней в работе в Excel?

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

    Если тебе для всех объектов, то такую строчку нужно делать для каждого объекта (т.е. уже получается таблица целая)

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

    @rPman
    Во первых, количество результатов не гарантирует что это действительно так... это приблизительная оценка, эжто видно особенно когда начинаешь искать редкие вещи, и количество результатов - десятки страниц, уже на пятой результаты заканчиваются.

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

    В третьих, запрос может быть распределенным на несколько машин, т.е. не каждый запрос на свою машину, это само собой, а именно один пользовательский запрос напрягает одновременно целый кластер. Мало того, я почти на 99% уверен что у гугла свое железо используется по полной (с момента как они стали активно использовать ИИ в своих алгоритмах поиска и построения индексов, уже лезт 10 гугл свои TPU пилит, минимум третья итерация, и в задачах ИИ они на пару порядков эффективнее GPU).

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

    Про софт - я не знаю, статей про это не помню, но нисколько не сомневаюсь, что такая компания как гугл могут запилить свой софт, работающий с хранилищем данных немного иначе чем это делают классические linux/win, когда каждый запрос к диску делает чуть ли не два копирования в оперативную память (это еще на уровне posix, затем пользовательский софт сериализацией занимается, это еще копирования), занимая ценный кэш процессора, но физически данные с дисков могут быть прочитаны в нужную область памяти вообще минуя процессор, как минимум nvme это могут штатно, так как висят на pci-e шине, да и sata точно есть механизмы, которые с помощью старого DMA могут копировать данные с указанных портов напрямую в области в памяти, точно читал о таких разработках в linux но до практически потрогать не доходило.

    p.s. первое что нагуглил по теме dma для nvme, обсуждают именно методы реализации инструментария в linux чтобы удобнее и быстрее с этим было работать из userspace (а не уровня драйверов)

    про tensor processing unit у них оказывается уже 5-ая ревизия должна быть (вот сравнение 4-ой ревизии, пишут про 20-кратное понижение carbon emission что бы это не значило)
    Ответ написан
    5 комментариев
  • Как лучше хранить много изображений для веб-приложения?

    @rPman
    Веб приложения максимально оптимизированы при работе с файлами на диске.
    Никакой другой метод не позволит дать такую производительность.

    Поэтому - авторизацию доступа делай на уровне веб сервера (вот пример с нормальным oauth)

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

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

    Тупой пример - числовой идентификатор переводи в hex, дели на группы по 4 символа и создавай соответствующие каталоги: /images/0d4f/3b00/a841/0d88, тут 0d88 это файл, остальные части - каталоги. Идентификатор соответственно 64-битное число 0x0d4f3b00a8410d88

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

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

    @rPman
    Фича новая, похоже ее тупо не дореализовали.

    Можно написать скрипт Google Apps Script, который из твоей таблицы google sheets будет перебирать ячейки, копировать их в документ google docs. Вся возня с ячейками, так что это сам.

    // Получаем доступ к ячейке, содержащей изображение
    var cell = SpreadsheetApp.getActiveSpreadsheet().getRange('A1');
    
    // Получаем изображение из ячейки
    var cellImage = cell.getCellImage();
    
    ....
    
    // Открываем Google Docs документ и получаем его тело
    var doc = DocumentApp.openById(docId);
    // var doc = DocumentApp.getActiveDocument();
    var body = doc.getBody();
    
    // добавляем изображение в google docs документ
    body.appendImage(cellImage);
    Код только пример, тут нет логики обработки таблиц
    Ответ написан
    Комментировать
  • Как убрать предупреждение хрома о вирусе?

    @rPman
    Возможно у тебя на компьютере и правда вирус? Скачай бесплатный drweb cleaner/kaspersky removal tool и проверь машину,
    В идеале используй их live cd образы (установи на usb флешку)
    Ответ написан
    Комментировать
  • Постоянный запуск SeleniumBase заполняет ОЗУ ПК, как очистить озу?

    @rPman
    Перед закрытием скрипта делай browser.quit(), а не browser.close() тогда запущенный браузер будет корректно завершен, browser это webdriver.Chrome()
    Ответ написан
  • Какую технологию использовать для проигрывания видео в браузере с ручной подгрузкой байтов?

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

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

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

    @rPman
    ты пишешь телеграм бот и хочешь чтобы браузер у пользователя открывался по твоему желанию?
    никак, иначе это была бы дыра приватности (вычислить ip клиента) и для фишинга
    Ответ написан
  • Ошибка 404 на GitHubPages, почему?

    @rPman
    Первый же результат на запрос инструкция по размещению github.io
    Обратите внимание, что после загрузки проекта файл index.html должен находиться в корневой директории проекта:

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

    @rPman
    в windows 10 и выше штатно идет openssh сервер (в более ранних версиях такой сервер ставится сторонними средствами в пару кликов, ну может с русскими именами файлов будут легкие проблемы), ищи в Параметры ПК - Дополнительные компоненты - добавить компонент.

    Настраиваешь беспарольную аутентификацию по ключу на целевой машине/профиле и запускаешь удаленно консольную утилиту shutdown /s (по умолчанию оно выключит машину через 1 минуту, предупредив всех работающих на нем пользователей, за это время выключение можно отменить)

    Кстати openssh не обязательно устанавливать, так как штатный планировщик заданий умеет работать по сети - там сверху по правой кнопке можно выбрать подключение к другому компьютеру (при наличии домена или рабочей группы с одинаковыми паролями и администраторскими правами) ну и соответственно утилита командной строки schtasks
    Ответ написан
    Комментировать
  • Как парсить курсы валют с биржи dedust?

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

    Могу предположить что цены там тупо берутся тут https://api.dedust.io/v2/prices (этот запрос раз в 3 секунды идет со страницы)
    Ответ написан
    2 комментария
  • Как максимально быстро кликнуть на элемент в браузере?

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

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

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

    По правильному можно разобраться как все работает и на javascript написать максимально эффективное приложение (прямо тут же в консоли браузера) по опросу сервера.
    Ответ написан
  • Как выйти из двух пользователей в Linux, и при этом выполнить команду один раз?

    @rPman
    убить оба шела, сессия автоматически завершится

    Скрипт для этого пиши сам
    ps
    покажет список текущих процессов сессии, а там обычно только sudo и bash (ну и работающий ps), так получишь pid текущего bash
    pstree -s pid_текущего_шела -p
    покажет в одной строчке всех предков от указанного процесса, например так
    systemd(1)───xfce4-terminal(3933)───bash(5169)───sudo(1726858)───sudo(1726872)───bash(1726873)───pstree(1732257)

    тебе достаточно убить два последних sudo и bash (или чем ты там пользуешься) с конца этого списка
    например так
    kill -KILL 1726873 1726872 1726858 5169
    Ответ написан
    Комментировать
  • Как повторно инициализировать жёсткий диск?

    @rPman
    В терминах windows, инициализация - это создание таблицы разделов (спросит DOS MBR или GPT, выбирай второе в 99% случаев тебе подойдет), там еще есть вариант - динамический, это если у тебя софтварный рейд (превращает несколько дисков в один).

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

    p.s. есть утилита командной строки diskpart, она позволяет гораздо больше делать с дисками чем gui, если тебе прям очень нужно повторно проинициализировать диск, пользуйся ей (там есть команда clean, но предварительно нужно выбрать select disk ... будь внимателен и читай хелп)
    Ответ написан
    Комментировать
  • Можно ли установить Windows 7 на внешний жёсткий диск?

    @rPman
    Если это usb контроллер то скорее всего нет. С некоторыми оговорками, можно извернуться, настроить своп файл на sata/ide диск, подшаманить и перенести установку на usb но я успешно этот квест не завершил (не сильно старался)

    Причина - своп файл windows не может находиться на removable дисках, это искуственное ограничение, созданное майкрософт специально, и скорее всего там уже забили как это убрать. К сожалению штатно своп файл нельзя отключить (если его отключить в интерфейсе, windows создает своп файл в каталоге \windows)

    Есть версии, основанные на winpe, это достаточно кастрированная версия windows, на которую нормально не установить драйвера на видеоускоритель, эти сборки на usb устанавливаются.
    Ответ написан
    1 комментарий
  • Стал тормозить ютуб?

    @rPman
    есть какие то адблоки
    запусти для теста браузер в новом чистом профиле без расширений и с дефолтными настройками, если не будет тормозить, начинай по одному включать расширения и тестировать, пока тормоза снова не появятся.
    Ответ написан
  • Почему появляется ошибка Sqlite3.OperationalError: table users has no column named name?

    @rPman
    Что за одинарная ковычка после скобки
    CREATE TABLE IF NOT EXISTS users (' <---
    и она же идет в конце списка описания полей

    т.е. sqlite создает таблицу с единственным полем, имя которого
    id INTEGER auto_increment P...EXT, email TEXT, trip TEXT, seek TEXT, extra TEXT
    прямо так со всеми запятыми и пробелами

    Ну и само собой, пользуйся удобными GUI для sqlite их много, там сразу все поймешь
    Ответ написан
  • Как навсегда исключить игровой кряк из проверки защитника Windows?

    @rPman
    Отключить антивирус, установить от другой компании, где игнор лист еще не сломан.
    Ответ написан
    1 комментарий