• Что особенного в IP адресе 8.8.8.8?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Многие провайдеры при истощении баланса перенаправляют все клиентские http-запросы на свою страничку с уведомлением о необходимости оплаты и каким-нибудь эквайрингом. Очевидно, что для их работы нужен работающий DNS, а зачастую ещё и доступ к CDN. Провайдеры поумнее оставляют доступ к своему DNS и запросы к CDN тоже через себя проксируют, но некоторые не заморачиваются и просто оставляют часть доступа в дикий интернет.
    Ответ написан
    3 комментария
  • Как шифровать текст в python?

    AgentSmith
    @AgentSmith
    Это мой правильный ответ на твой вопрос
    способ расшифровки должен быть непопулярным.

    А вот это уже смешно. Чем тебя не устраивают популярные способы типа RSA?
    Ты, видимо, не слышал о термине Security through obscurity , на котором обожглись многие и ты хочешь повторить их путь
    Ответ написан
    10 комментариев
  • Чем отличаются любительские МК от промышленных?

    1. Arduino - это не МК, а отладочная плата / плата для прототипирования
    2. Сами МК не делятся на "промышленные" и "любительские". Тк в такой классификации просто нет смысла.
    3.
    наверное надежностью?

    Надёжностью при определённых условиях могут отличаться некоторые специальные серии микроконтроллеров.
    4.
    какая разница в цене?

    Открываешь каталог и сравниваешь :)
    Где-то разницы нет, а где-то разница может быть в несколько порядков, в зависимости от требований

    если надо сделать умный дом или ферму, или теплицу.. (не работа в профессиональной индустрии)
    что лучше выбрать?

    То что будет лучше отвечать поставленным требованиям.

    Ещё про профессиональные/любительские

    Платы можно условно поделить на:

    Профессиональные отладочные/демонстрационные платы типа STM32 Discovery цель которых - показать разработчику возможности конкретного чипа или серии чипов

    Любительские, типа того же Arduino, которые предназначены для прототипирования, самоделок, и изучения программирования.

    Учебные/детские, наподобие micro:bit - только для того чтобы учить детей программированию в интерактивной и удобной форме.

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

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

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

    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 комментария