• Как быстро получить случайное слово из файла на 12 ГиБ?

    @dima20155
    you don't choose c++. It chooses you
    Вариант с потолка: генерируйте случайную позиции в файле (от нуля до размера файла в байтах). Читаете все окружающие символы пока не найдете два символа новой строки ('\n') до и после исходной случайной позиции. Между этими символами новой строки и будет ваше случайное слово.

    Рандом, конечно же, не совсем честный и сильно зависит от различия в длинах строк в файле.
    Ответ написан
    22 комментария
  • Что быстрее и меньше занимает памяти: dict или Redis?

    vabka
    @vabka
    Токсичный шарпист
    Redis - это отдельный процесс так что общение с ним в любом случае будет медленнее (с большей задержкой), чем со словарём в твоём же процессе.

    Пустой Redis точно будет занимать больше памяти, чем пустой словарь.

    Скорость и конкретное потребление памяти - это уже вопрос, для ответа на который нужно иметь более конкретные вводные.


    чуть ли не каждую секунду

    Изменение одной записи в секунду - это слёзы по меркам компьютера
    Ответ написан
    Комментировать
  • В чем минусы событийно ориентированного подхода?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Ну да, Вы перепутали сообщение и событие. Вызов метода объекта в ООП можно интерпретировать как сообщение этому объекту из конкретного места и контекста в выполняющемся коде.
    Это не то же самое, что события. Нет никакой шины или очереди событий.
    Для событийного программирования существуют Pub\Sub механизмы, в рамках которых есть паблишеры, которые формируют событие в любом месте и контексте кодовой базы, а есть подписчики, которые реагируют на конкретные типы событий, обрабатывают и передают их дальше или терминируют.
    Этот подход иногда полезен, но часто он рубит распыляет логику по куче обработчиков. Такие системы очень сложно отлаживать, трудно тестировать, практически невозможно доказывать корректность программы для любой допустимой входной последовательности событий. Антипаттерн это потому, что после некоторого порога сложности начинает накапливаться много формальных событий и неочевидных состояний системы. Эта мешанина трудно воспринимается и анализируется человеком
    Ответ написан
    7 комментариев
  • Сколько байтов нужно для хранения 60 паролей (или как переводить биты в байты без ошибок на любом этапе задачи)?

    Jacen11
    @Jacen11
    вы же сами написали
    потом надо перевести их в байты (8,25 байт, округлить в большую сторону = 9 байт)

    то есть на самом деле на слово уходит 72 бита
    72*60 паролей / 8 = 4320/8 = 540

    внимательно надо читать что в учебнике написано, пункт 4 "целое количество байтов" на слово
    Ответ написан
    Комментировать
  • Почему wasm код не генерируется при компиляции rust кода с сырыми указателями?

    bingo347
    @bingo347
    Crazy on performance...
    Начну пожалуй с того, что в первом примере у Вас UB (undefined behavior):
    #[no_mangle]
    pub fn test() {
        // Вот тут на стеке выделено 4 байта
        let mut idx: i32 = 10;
        // Указатель на эти 4 байта
        let ptr = &mut idx as *mut i32;
    
        // По сути указатель на те же 4 байта, но на деле указатель на 40 байт
        let buffer = unsafe { core::slice::from_raw_parts_mut(ptr, 10) };
    
        // И тут мы работаем с этими 40 байтами,
        // но нормальные из них только 4 байта в начале,
        // а остальные смотрят в глубь стека и меняют его
        // то есть перетирают адрес возврата и данные на стеке вызвавшей функции
        for pixel in buffer.iter_mut() {
            *pixel = 0x7d2b7500;
        }
    }
    То есть после завершения данная функция должна не вернуться в вызывающую функцию, а передать управление непонятно куда.

    Ну и еще один момент, это оптимизация, данная функция не имеет сайд эффектов и ничего не возвращает. После инлайна функции core::slice::from_raw_parts_mut и метода Iterator::iter_mut компилятор вполне может понять, что данный код не имеет сайд эффектов, а значит бесполезен и его можно вырезать. Вот собственно он его и вырезает.
    Во втором же примере у нас есть сайд эффект - изменение данных по указателю пришедшему извне через аргументы.

    P.S. Во втором примере кстати тоже можно увидеть работу оптимизации, цикл из 10 итераций, пишущих i32 в смещение по указателю, был заменен на обычные 5 записей i64 в смещение по указателю.
    Ответ написан
    1 комментарий
  • Как в GO конвертить tiff в jpeg?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Быстрый и грязный метод.

    Использовать системные вызовы imagemagick на тех картинках где есть ошибка
    Ответ написан
  • Почему Doom портируют куда только можно?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Doom - это была одна из первых игр где была реализована в полной мере техника BSP (Binary-Space-Partition). Это позволяло в реальном времени очень быстро сортировать и рендерить полигоны без привлечения Z-Buffer. (Рендеринг был чисто прогарммный. На то время еще не было ускорителей 3Д графики и видеокарточка умела только отображать память на экран. ) Игра не была по настоящему трехмерной. А только рализовывала 1 этаж. Рендерить надо было только пол и потолок. Для каждой точки где стоял персонаж. И наклонных горизонтальных поверхностей в ней не было как раз по этой причине. Ее называли 2.5-мерной игрой. Было также много идей оптимизации вычислений. Например вместо вещественных чисел - целые 32х битные с fixed point.

    В скобках замечу что это был 1993 год и на дворе было царство Intel 286/386. Это были машины с тактовой частотой меньше ваших телефонов (Pentium только только релизнулся и еще ни у кого не был). И трехмерный Doom был прорывом. На моем тогда еще 386SX от подтормаживал но играть было можно. И со звуком для SoundBlaster. И конечно это было лучше чем Wolfenstein.

    Аналогичное было реализовано в Duke Nukem 3d. Но Дюк был менее популярен ИМХО. Были и масса других 3д игр в жанке RPG но они были не такие динамичные. Походовые в основном.

    Вобщем сегодня если вы гейм-дев то вам желательно хотя-бы ознакомиться с техниками оптимизации которые были в Doom. Можно почитать и про Quake но это просто развитие идеи BSP деревьев для полного 3D с 5 или 6 степенями свободы. Еще можно почитать про реализацию игры Esctatica. Там не на полигонах а на шариках или эллипсах реализована игровая графика. Тоже интересно.

    UPD: Заменил MMORPG на RPG.
    Ответ написан
    6 комментариев
  • Замена dict^ов в питоне. Какие существуют аналоги?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    пишу GUI на android, хотелось бы снизить количество потребляемой оперативной памяти.

    Не пишите на Python.
    Ответ написан
    Комментировать
  • Нужно ли создавать индекс для каждой колонки?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Нет. Чем больше индексов, тем медленнее работают DML-запросы и больше размер базы. Подбор правильных индексов - это тонкое искусство выбора инженерных компромиссов, требующее глубокого понимания принципов работы реляционных баз данных и сценариев работы системы с данными.
    Ответ написан
    Комментировать
  • Есть ли простой для восприятия алгоритм ассимитричного шифрования?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    База асимметричного шифрования весьма проста. Для RSA:
    Берём два простых числа p и s, например
    p = 19
    s = 13
    Вычисляем их произведение n и функцию Эйлера f:
    n = p * s = 247
    f = (p - 1) * (s - 1) = 216
    Подбираем коэффициент k и экспоненту e так, чтобы значение d = (k * f + 1)/e было целым
    k = 9
    e = 5
    d = 389, целое
    Пара (e, n) даёт нам ключ для шифрования, пара (d, n) - ключ для дешифрования.
    crypted = messagee % n
    decrypted = cryptedd % n
    Очевидно, что из за операций по модулю мы можем шифровать сообщения в диапазоне [0, n - 1].
    message = 200
    crypted = 2005 % 247 = 174
    decrypted = 174389 % 247 = 200
    Основная сложность в том, что для защиты от подбора ключа нам нужны очень большие простые числа и значения n. Вот тут и возникают алгоритмы вычисления степеней, модулей и прочих операций с 1024-, 2048-, 4096-разрядными числами.
    Ответ написан
    4 комментария
  • Можно ли написать OS на Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Сейчас включу максимального зануду и скажу, что не всё так уж однозначно.
    Вопрос в том, что называть языком. Если языком считать синтаксис, то вполне можно написать транспилер, который будет транслировать питоновский код в сишный код, например, а его уже в машинный.
    ОС, написанная на Си - это скомпилированный машинный код - результат работы компилятора над исходником на языке Си. Да, стандартный компилятор Си может откомпилировать машинный код, а потом стандартный сборщик превратит его в набор файлов операционной системы.
    Стандартный транслятор питона в его байткод и интерпретатор этого байткода не смогут работать самостоятельно без операционной системы, но разве в условии вопроса было сказано про стандартный интерпретатор?

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

    Простой ответ - нет, питон не предназначен для написания ОС, но использовать его для разработки большОго количества элементов ОС можно.
    Ответ написан
    2 комментария
  • Удаление данных из БД через определенное время?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Этот вопрос тут задаётся ежемесячно. Не надо ничего удалять, нужно добавить поле, хранящее дату подписки, и потом при выборках проверять, что с даты в этом поле прошло больше месяца. Или добавлять в это поле дату окончания подписки и проверять, что текущая дата больше.
    Ответ написан
    1 комментарий
  • Почему разные значения в операторе is в Python?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Предполагаю, что CPython при компиляции скрипта сохраняет литерал 1234 в соответствующую область памяти, а потом в переменные a и b записывает на него ссылку. В консоли же у него нет единицы компиляции, из которой можно выделить общие литералы.
    Ответ написан
    Комментировать
  • Какую выбрать СУБД, если в день может быть более 11млн записей?

    При такой постановке задачи лучшим вариантом СУБД будет та, которую знают и умеют обслуживать ваши админы.
    С таким объёмом вставок справится любая мейнстримная на правильно подобранном железе. Что ещё вы собираетесь делать с этими записями нам неведомо, посему на выбор повлияеть не может.
    Ответ написан
    1 комментарий
  • Делается ли merge при rebase?

    toxa82
    @toxa82
    Итоговый результат слияния кода при merge и rebase одинаковый. Разница будет только в порядке коммитов в истории. Merge сверху применяет новые коммиты, rebase находит общего предка, убирает ваши новые коммиты в ветке, обновляет ветку, применяет ваши новые коммиты сверху.
    Ответ написан
    Комментировать
  • Как понять работу следующего кода по перегрузке операторов?

    Vindicar
    @Vindicar
    RTFM!
    Потому что питон пытается "извернуться", если описаны не все операторы.
    Если выполняется a < b, но не описан оператор a.__lt__(), питон попробует вызвать b.__gt__().
    Аналогично, если не описан __ne__() а только __eq__(), и выполняется a != b, питон сделает not (a == b)
    Кое что есть тут
    Также советую глянуть в сторону functools.total_ordering.
    Ответ написан
    3 комментария
  • Как пишут обмен данными (сетевой движок) для компьютерных игр?

    twobomb
    @twobomb
    Какие известны хитрости, чтобы передавать меньше данных, не рискуя рассинхроном?

    Чем меньше тик рейт сервера, тем меньше данных. Одно дело динамичный шутер(батла на 130 человек), а другое дело кооп игра на 4 человек. В одних случая критичен высокий тик рейт в других нет. Хотя... умереть в батле через секунду после того как ты забежал за стену благое дело...
    Какие рассинхроны не критичны?

    Опять зависит от игры.
    В каком порядке происходит проигрывание на сервере того, что на клиенте было сделано, и как клиенты-друзья воспроизводят действия?

    Ну почитайте какие нибудь статьи вот например на хабре
    Мультиплеер в быстрых играх (части I, II)
    Мультиплеер в быстрых играх (Часть III: появление ...
    Мультиплеер в быстрых играх (Часть IV: Хэдшот! Пут...

    В двух словах определитесь с направленностью игры, тик рейтом, частопердаваемые данные передавайте по протоколу UDP, используйте интерполяцию для движений.
    Ответ написан
    1 комментарий
  • Что лучше осваивать для быстрого входа в работу и заработка - тестирование или разработка (python)?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Плохое вы время выбрали для вкатывания, сейчас джунов стало сильно больше, а спроса на них сильно меньше. Вам придётся конкурировать с толпой молодняка, готовых продолжительное время работать за еду, среди которых будет ещё и немало тех, кто не искал лёгких путей.
    Ответ написан
    4 комментария
  • Как из вложенного словаря получить список?

    0xD34F
    @0xD34F
    arr = [ { 'id': k, **v } for k, v in dct.items() ]
    Ответ написан
    Комментировать
  • Какой БД выбрать для ERP-систему, SQL или NoSQL?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    NoSQL а рекомендуют многие, говорят бистре чем SQL

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

    сейчас проект работает на Postgresql

    Его хватает и "Мой склад", и "Сберу" и многим другим, до чьих нагрузок вам добираться ещё годы, даже если у вас всё пойдёт замечательно.
    Ответ написан
    Комментировать