Задать вопрос
  • Как правильно создавать большие архивы данных?

    2ord
    @2ord
    1. Ничего особого не требуется
    2. Без разницы
    3. Имеет смысл хранить хэш-сумму (MD5, SHA1) рядом с файлом и сверять архивы по ней для удостоверения целостности.
    4. Возможно, разбивать потенциально большие архивы на тома, скажем, по 20-50 МБ, чтобы в случае обрыва связи было проще перезалить в облако.
    5. Очень даже может быть. Во времена магнитных накопителей имело смысл создавать архивы с некоторыми дополнительными служебными данными, используемыми при восстановлении файлов в случае повреждения, вызванными размагничиванием или при записи. Сегодня это неактуально и, в основном, ненадежный канал связи может являться причиной битых архивов. При использовании программ для синхронизации данных не исключено, что при обрыве связи не работает как положено механизм повтора.
    Ответ написан
    Комментировать
  • Как распаковать все архивы внутри папок с сохранением структуры?

    2ord
    @2ord
    Bash:
    tar xf названиеархива.tar.gz
    # затем распаковываем все .gz в поддиректориях на своих местах:
    find . -type f -name '*.gz' -exec gunzip {} \;
    Ответ написан
    Комментировать
  • По какой логике в редисе работает получение всех записей?

    2ord
    @2ord
    scan <cursor> MATCH user:* COUNT 100
    вместо <cursor> выставить 0 и дальше изменять согласно полученному курсору.
    https://redis.io/commands/scan/
    Ответ написан
    Комментировать
  • Как искать зашифрованные данные через like?

    2ord
    @2ord
    Если верно понял требования, то вот мои мысли.

    Использовать Transparent Data Encryption (TDE)

    Выполнить шифрование данных на уровне таблиц:
    https://www.postgresql.org/docs/current/encryption...
    https://dev.mysql.com/blog-archive/controlling-tab...

    То есть расшифровывание будет происходить на уровне СУБД, а с точки зрения приложения - обычные запросы LIKE.
    Ответ написан
    1 комментарий
  • Как добавить файлы в архив по маске через 7zip?

    2ord
    @2ord
    Скрипт с циклом for по маске *.docx , в каждом найденном файле взять первый символ (Unicode) файла, приставить в конце .7z и получится имя файла, куда нужно добавить этот документ в архив. Ну и составить команду добавления в архив. Читать справку по cmd скриптам, 7z.
    Ответ написан
    Комментировать
  • Как искать Видео на Youtube по содержащемуся там слову?

    2ord
    @2ord
    Необходимо, чтобы сервис Youtube извлекал слова из видеопотока и сохранял эти метаданные, добавлял в индекс для последующего поиска при помощи языка запросов через REST API. Сложность в огромных затратах энергии, уходящих на анализ такого массива видео, при недостаточном качестве извлечения текста для множества языков.

    Чтобы создать такой поисковый сервис по Youtube, необходимо определить появление новых видео, скачивать по сети огромное кол-во данных, затем анализировать видео своим алгоритмом и, по сути, создать дополнение к Youtube на своих мощностях.
    Ответ написан
    3 комментария
  • Как более лаконично написать линию кода с puts?

    2ord
    @2ord
    ENTRIES = %w[name bet game cf href]
    # заполним произвольными данными
    events = ENTRIES.each_with_object({}) {|name, h| h["BK1_#{name}"] = rand(10)}
    p ENTRIES.map {|entry| "BK1_#{entry}"}
    puts *ENTRIES.map {|entry| events["BK1_#{entry}"]}

    дальше сам
    Ответ написан
    Комментировать
  • Как дамп данных windows 7 перенести на windows 10?

    2ord
    @2ord
    С помощью Laplink PCmover и подобных программ.
    Ответ написан
    Комментировать
  • Почему приходит не полностью декодированый ответ?

    2ord
    @2ord
    Похоже, что поток Gzip декодируется без проблем. Там внутри просто бинарные данные, которые надо уметь десериализовать и map-ить на внутренние структуры данных. Для этого нужно проводить реверс-инжениринг или читать документацию у автора данных.

    Получаем такие данные
    [:open]
    I, [2022-12-31T13:01:18.377633 #12831] INFO -- : ==> message size 135
    "y\x00\x00\x01\x87\x00\x01\x00c\x00\x05\x17\x0E\x01\xF4\x01\x02,\x01\x03,\x01\x04\xC8\x00\x05d\x00\x062\x00\a,\x01\b2\x00\t\x1E\x00\n\x14\x00\v\n\x00\f\x00\x00\r\x00\x00\x0E\x00\x00\x03\x01\x00\x04\x00\x00\x00\x02\x01\x00\x04\x00\a\x01\xEA\x01\xEA\x01\x02\x19\x04\x19\x04\x03\x10\x00\x10\x00\x04\xB1\x03\xB1\x03\x05:\x00N\x04\x06\x00\x00\x12\x04\a"
    I, [2022-12-31T13:01:18.378144 #12831] INFO -- : ==> message size 1511
    "\x8A\x04\x01\x03\r\xD6\x00\x00\x00\x01\xD6\x00\x00\x00\x87\x13\x91\x00\x80\\\xB0c\x12\x00\u0411\u0430\u0440\u0441\u0435\u043B\u043E\u043D\u0430\x10\x00\u042D\u0441\u043F\u0430\u043D\u044C\u043E\u043B\x01\v\x00\x00\xFE\n\x00\x00\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\xFE\xB4\x92\x00\xA0x\xB0c\e\x00\u041C\u0430\u043D\u0447\u0435\u0441\u0442\u0435\u0440 \u0421\u0438\u0442\u0438\x0E\x00\u042D\u0432\u0435\u0440\u0442\u043E\u043D\x11\x00\x00\x000"
    I, [2022-12-31T13:01:18.378693 #12831] INFO -- : ==> message size 3004
    "\x9C\x04&g\x00\x00\x02\x00\x007\x00https://winline.ru/resources/images/app_topbar/..."
    I, [2022-12-31T13:01:18.453962 #12831] INFO -- : ==> message size 24931
    "\x10\x00e\x00\x00\x004\x00\x00\x00c\x00\x00\x00\x00\x00\x02\x00RT\b\x00FullTime\v\x00RegularTime\b\x00HalfTime\x06\x00Period\b\x00OverTime\a\x00Penalty\x01\x00Z\x01\x00W@\x00\x00\x00c\x00\x00\x00\x00\x00\x02\x00R"
    I, [2022-12-31T13:01:18.848721 #12831] INFO -- : ==> message size 198262
    "\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01L\x01\x00\x00\x00\x00\x00\x00\b\x00Bulgaria\x17\x00\x00\x00\x01\a\x00\x02\x00\x00\x01C\x00\x00\x00\x00\x00\x00\x00\x06\x00Greece\x0F'\x00\x00\x01\v\x00\x05\x00\x00\x01n\x01\x00\x00\x00\x00\x00\x00\a\x00Vietnam\x0F'\x00\x00\x02\x03\x00"
    I, [2022-12-31T13:01:18.860996 #12831] INFO -- : ==> message size 22
    "\a\x00"
    I, [2022-12-31T13:01:18.861229 #12831] INFO -- : ==> message size 786
    "\x9D\x04e\x00\x00\x00\x9A\x96\x01\x00\x18\x00\x00\x00\xE0\xFD\x80d\x11\x00\x00\x00\b\x00\x00\x00\x10\x90\xFBc\x8D\xD6\x00\x00\b\x00\x00\x00\x90?\x17d\f\x00\x00\x00}\x00\x00\x00P\xFB|d\x10\x01\x00\x00\x12\x00\x00\x00PY\x97d\\\x04\x00\x00\n\x00\x00\x00\xD0cvd^\xD6\x00\x00\x1C\x00\x00\x00\xA0\x80\x98d\x97 \x00\x00&\x00\x00\x00\xF0"
    I, [2022-12-31T13:01:18.861596 #12831] INFO -- : ==> message size 6961
    "\x04\x00\x0F\x00\x00\x00\x18\x00\x00\x00\a\x02\x00\x00\x02V\x00\x00\x00\x01\x00\x00\x00\n\x00\x00\x00\x89\x01\x00\x00\x00\x13\x00Club Friendly Games\x02\n\x00\x00\x00\x0F'\x00\x00\x02\x1C\x10\x00\x00\x02\x00\x00\x00@B\x0F\x00p\x00\x00\x00\x00\x10\x00Super Lig, Women\x02"
    I, [2022-12-31T13:01:19.087934 #12831] INFO -- : ==> message size 9567
    "\x04\x00\x13\x00\x00\x00#\x00\x00\x00\xD6\x02\x00\x00\x02S\x02\x00\x00\x02\x00\x00\x00@B\x0F\x00p\x00\x00\x00\x00\x04\x00TBSL\x02\x01\x00\x00\x00\x00\x00\x00\x00\x02\xD7\x02\x00\x00\x02\x00\x00\x00@B\x0F\x00q\x00\x00\x00\x00\x03\x00NBL\x02\x0F'\x00\x00\x0F'\x00\x00\x02[\x03\x00\x00\x02\x00\x00\x00@B\x0F\x00q\x00\x00\x00\x00\x04\x00"
    I, [2022-12-31T13:01:19.089121 #12831] INFO -- : ==> message size 22
    "3\x00"
    I, [2022-12-31T13:01:19.380693 #12831] INFO -- : ==> message size 43
    ",\x00l\x00\x00\x00\x0F\x00149.106.242.182"
    ^C[:close, 1006, ""]
    В некоторых сообщениях есть общие заголовки данных, например, "\x04\x00".

    чуток модифицированный код

    require 'faye/websocket'
    require 'eventmachine'
    require 'permessage_deflate'
    
    require 'logger'
    LOGGER = Logger.new($stdout)
    
    def dump_data(data, limit = 100)
      # puts data.unpack('H*')
      puts data[0, limit-1].dump
    end
    
    EM.run do
      ws = Faye::WebSocket::Client.new(
        "wss://wss.winline.ru/data_ng?", 
        [],
        # :headers => headers, 
        :extensions => [PermessageDeflate]
      )
    
      ws.on :open do |event|
        p [:open]
        ws.send "lang"
        ws.send "AQ==" 
        ws.send "data" 
        ws.send "WINLINE" 
        ws.send "getdate" 
        ws.send "no_fordata" 
    
      end
    
      ws.on :message do |event|
        LOGGER.info "==> message size #{event.data.length}"
        gz = Zlib::GzipReader.new(StringIO.new(event.data.pack('C*')))    
        dump_data(gz.read)
        gz.close
      end
    
      ws.on :close do |event|
        p [:close, event.code, event.reason]
        ws = nil
      end
    end
    Ответ написан
    1 комментарий
  • Что может писаться в персистентное хранилище в rabbitmq?

    2ord
    @2ord
    1. Проверить, работает ли обработчик очереди, не падает ли из-за ошибок
    2. Проверить наличие ack обработчиком. https://www.rabbitmq.com/confirms.html
    3. Проверить темп публикации сообщений и его потребления. Если недостаточный у обработчика, то оптимизировать время обработки и добавить дополнительный, при необходимости.
    Ответ написан
    Комментировать
  • Как работает перенаправление вывода скрипта python?

    2ord
    @2ord
    Можно обвернуть системный вызов в async функцию и использовать await.
    https://realpython.com/async-io-python/#the-asynca...

    Добавлено:
    а нельзя ли просто сделать вывод в stdout и поточное чтение с вывода:
    python prog1.py | python prod2.py
    ?
    Ответ написан
    Комментировать
  • Должен ли программист выполнять роль девопса на сервере заказчика?

    2ord
    @2ord

    а договора небыло. просто был прислан текстовый файл с заданием и я ответил что сделаю это.

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

    Так что проще всего максимально оградить от проблем изначально, чтобы избежать недопонимания, как описал Владимир Коротенко . Ну и финансовая сторона. И действовать поэтапно, не выполняя работы без оговоренной предоплаты
    Сроки и всё такое - должно быть описано, чтобы всегда был пункт
    б) а если "так", то будет "вот так".

    Это можно писать простым языком, не юридическим. Никому не хочется заниматься с судами и многие вопросы лучше заранее решать за их пределами.
    Так что условия доставки ПО нужно хорошо обговорить. Кому-то достаточно доступа к GitHub,а кому-то нужно развернуть прямо в продакшен сервере. И даже на Маке ))
    Ответ написан
    2 комментария
  • В чем отличие float/double и decimal?

    2ord
    @2ord
    https://floating-point-gui.de/

    Статья: What Every Scientist Should Know About Floating-Point Arithmetic
    Ответ написан
    Комментировать
  • Что использовать для синхранизации данных?

    2ord
    @2ord
    По описанию задачи должна подойти реализация PouchDB протокола синхронизации Apache CouchDB. На практике ещё не пробовал.
    Ответ написан
    Комментировать
  • Почему у меня фото становятся розовыми после того как открываю файл?

    2ord
    @2ord
    Возможно, файлы JPEG повреждены. Розовый оттенок - из-за нарушений при декодировании цветового пространства YCbCr.

    Добавлено:
    Или что-то не так с программой-просмотрщиком. Стоит проверить в нескольких других и если ещё где-то история повторяется, то, возможно, что-то не так со структурой (форматом) JPEG.
    Ответ написан
    Комментировать
  • Как с помощью Flask сделать динамический вывод данных из txt файла?

    2ord
    @2ord
    Клиент может получать информацию по SSE порциями строк из файла. Для этого можно открыть процесс, запустив tail -f file.txt и читать построчно с stdout. Каждую строку или сразу несколько отправлять в стрим клиенту.
    https://man7.org/linux/man-pages/man1/tail.1.html
    Ответ написан
    Комментировать
  • Какой формат (с изменениями) эффективнее хранится в Git?

    2ord
    @2ord
    sqlite3 file.sqlite3 .dump > dump-`date +'%F %T'`.sql

    и заносим файл dump-`date +'%F %T'`.sql в Git.
    Или использовать другие VCS. Допустим, Subversion (использует xdelta для эффективного хранения).

    Добавлено:
    Нет, туплю. Суффикс -`date +'%F %T'` не нужен, иначе Git не будет хранить версии, а будет хранить множество файлов дампа.
    Ответ написан
    Комментировать
  • Подскажете по архитектуре "мультисервисного" приложения?

    2ord
    @2ord
    НО! Они все пользуются одной и той же БД, из которой "черпают" данные "общего назначения": юзеры, ассеты, события и пр.

    Вот я и хочу "общую часть" вынести куда-то отдельно. И спрашиваю как это принято делать: библиотека? модуль? сервис?
    Можно сделать как подключаемую библиотеку (пакет Java), вынеся всё в ядро самое необходимое. Вокруг библиотеки ядра могут быть созданы какие-то библиотеки-обвески. Репозиториев библиотек может быть несколько, для простоты. Каждая библиотека может иметь свою версию и использоваться монолитом при сборке.

    Это значит, мне надо сделать 1000 репозиториев, в каждом Х методов (получение по ID, получение по значению поля, одного объекта, коллекции...). И ещё 1000*Х методов в контроллерах....
    Ну зачем так? Нет смысла дробить даже на десятки, не говоря уже о тысячах.

    Начните с разделения по модулям, где у каждого компонента своя зона ответственности и нет переплетений зависимостей с другими компонентами.
    Нужно знать больше подробностей о предметной области и текущей архитектуре проекта, чтобы дать дополнительные советы.
    Ответ написан
    1 комментарий
  • Что за странный архив?

    2ord
    @2ord
    Скрытые файлы внутри архива?
    Ответ написан
    1 комментарий
  • Как перенести PDF-файл из таблицы в Blob?

    2ord
    @2ord
    Общий алгоритм:
    1. выполняем SELECT постранично (допустим, по 1-5 записей, чтобы не грузить всё в память)
    2. для каждой записи поблочно (скажем, по 64KB) читается поле BLOB, каждый из таких блоков при помощи Page Blob загружает на хранилище.
    3. делаем другие операции, по необходимости.
    Ответ написан
    Комментировать