• Насколько глубоко нужно знать Linux дата-инженеру?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    По-хорошему, надо знать то, что потребуется для работы.
    Обычно это понимание как работает командная строка, терминал, ssh.
    Немножко вглубь: файлы, дескрипторы, файловая система, монтирование, симлинки, хардлдинки, пайпы, конвейеры, синтаксис перенаправления между стандартными потоками ввода/вывода, базовые утилиты командной строки (grep, ls, tee, tail, cat и т.д.), желателен какой-то опыт работы со всем этим, понимание как обычно устроен механизм передачи параметров в таких утилитах, как их выстроить в конвейер, как запаковать\распаковать поток данных на лету. Желательно понимать что такое, как устроены и для чего нужны make-файлы.
    Нужно понимать как пользоваться менеджерами пакетов основных дистрибутивов, желательно в общих чертах понимать что такое докер, контейнеризация в целом, ориентироваться в командах управления образами и контейнерами, понимать что такое вольюмы и где их искать, уметь читать докер-файлы и компоуз-файлы, понимать как вообще это всё работает. Ну и GIT нужно уметь использовать.

    Это основа, но наверно от джунов всего списка никто ожидать не будет - обучат по ходу дела, а если вы претендуете на большее, то сможете быстро разобраться в нужных вопросах, если претензии ваши обоснованы, а пробелы обнаружились.
    Ответ написан
    6 комментариев
  • Что такое PSS.MAX_LENGTH?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Очевидно это длина соли и по умолчанию она уже максимальна, но можно солить и не максимальной по длине солью. Я присоединяюсь к вопросу. что вас не устроило в документации?
    Этот параметр задан в библиотеке у функции по умолчанию. Если вы не знаете что там прописать - не трогайте.
    Чему равно максимальное значение вы можете увидеть прыгнув на реализацию этой константы, ну или просто напечатав это значение в консоль.
    Ответ написан
    Комментировать
  • TLSv1_3 в aiohttp?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Забавно. Скоро не будет никакого смысла идти за ответом сюда, когда можно к чатжпт сходить.
    Даже читать не стал ваш вопрос после заголовка и скопировал его в чатжпт4. Вот что он ответил:

    В `aiohttp`, процесс создания и настройки пользовательского TLS контекста отличается от того, что используется в `requests`. В `aiohttp`, вы должны настроить SSL контекст до создания сессии и передать его в качестве аргумента при создании клиентской сессии. Вот как вы можете адаптировать ваш пример для `aiohttp`:

    1. Создайте SSL контекст, используя стандартную библиотеку `ssl`.
    2. Настройте контекст, задав нужные параметры, такие как версия TLS, набор шифров и кривые ECDH.
    3. Создайте экземпляр `aiohttp.ClientSession`, передав SSL контекст.

    Пример кода:

    import ssl
    import aiohttp
    
    class TLSv1_3_BYPASS:
        ciphers = '...'  # Здесь должен быть ваш список шифров
    
        @staticmethod
        def create_ssl_context():
            ssl_context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
            ssl_context.set_ciphers(TLSv1_3_BYPASS.ciphers)
            ssl_context.set_ecdh_curve("prime256v1")
            ssl_context.minimum_version = ssl.TLSVersion.TLSv1_3
            ssl_context.maximum_version = ssl.TLSVersion.TLSv1_3
            return ssl_context
    
    # Создание SSL контекста
    ssl_context = TLSv1_3_BYPASS.create_ssl_context()
    
    # Создание aiohttp сессии с пользовательским SSL контекстом
    async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=ssl_context)) as session:
        # Теперь вы можете использовать session для выполнения запросов
        response = await session.get('https://example.com')
        # ...


    В этом примере кода создаётся пользовательский SSL контекст, который затем используется для создания `aiohttp.ClientSession`. Обратите внимание, что вам нужно будет заменить `'...'` в `ciphers` на фактический список шифров, которые вы хотите использовать.
    Ответ написан
    Комментировать
  • Как создать связь с полем модели внутри нее?

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

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

    trapwalker
    @trapwalker
    Программист, энтузиаст
    По двору прошелся жулик и попытался хакнуть эксплойтом для "майбаха" (условно) все тачки в вашем дворе. Майбахов не нашлось, этот жулик пошел дальше и забыл уже про ваш дворик.

    Надо ли защищаться от атаки, не релевантной вашему сетапу? Не надо.
    Надо ли делать выводы об уязвимости того или иного оборудования? Надо.
    Надо ли проверять свои конфигурации на эксплойты? Надо.
    Надо ли реагировать на всякую нерелевантную хрень в логах с ошибками порядка 400? Не надо.
    Надо ли позаботиться об оркестрации быстрого развёртывания ваших серверов на случай взломов или проблем с железом? Конечно надо!

    Вообще, если ваш сетап на виртуальных машинах в повторяемой среде и с декларативной конфигурацией вроде кубера или докера, то вы легче сможете пережить всякие такие факапы.
    Схема такая.
    Есть признаки взлома - бэкап логов, снапшот базы, бэкап стораджа, остановка сервисов (если позволяет продакшн), анализ атаки и последствий. Устраняем уязвимость по вектору атаки (гугление по логам и курение тредов), правим конфиги развёртывания и запускаем прод. Потом долго и тщательно разбираемся по логам, снапшотам и бэкапам что затронуто. Делаем тестовый чистый сетап по старой конфигурации и сравниваем пофайлово с атакованной системой, выясняем в какие места вмешались злодеи. Дифаем базу и смотрим на подозрительные различия. Делаем выводы, объявляем об утекших данных, если есть такие признаки (чтобы не подставлять пользователей), принимаем превентивные меры против похожих векторов атак.

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

    Это взгляд дилетанта по безопасности, если чего пропустил -- поправьте. Если где не прав -- расскажите.
    Ответ написан
    3 комментария
  • Можно ли узнать username человека по его id в телеграм?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    нет.
    Ну законно и добросовестно используя АПИ.
    Ответ написан
    Комментировать
  • Как получить описание устройства в системе через python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    У вас виндузятников там есть вроде консольная команда driverquery
    Можно её выполнять из питона и парсить результат. Там есть в выхлопе нужное устройство?
    Можно попробовать подключаться перебирая все порты, если есть возможность определить при успешном подключении нужное это устройство или нет.
    Искать нужно как найти нужные данные через консоль, а потом искать как выполнить консольную команду из питона и получить консольный выхлоп, а потом искать нужную строчку в выхлопе.
    Примерно такой путь.
    Ответ написан
    Комментировать
  • Что учить дальше?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Начинайте ходить на собеседования в качестве джуна, так вам быстро объяснят что нужно подтянуть.
    Конечно пет-проекты - это хороший буст, проекты на гитхабе, если он упомянуты в резюме, смотрят многие работодатели. Не все с охотой берут джунов, но если у джуна есть код и видна его активность. то есть надежда, что удастся его воспитать в профессионала и относительно недорого сформировать себе кадры период кадрового голода.
    Соберите портфолио пет-проектов, поучаствуйте в опенсорсе, подемпингуйте на фрилансе работая за репутацию... Однако есть подозрение что любой первый тривиальный проект откроет вам глаза на кучу пробелов в ваших знаниях и умениях.
    Ответ написан
    4 комментария
  • Какая утилита подобна wget, но умеет делать upload дерева файлов по https?

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

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Есть персонаж с неким состоянием. Хорошо представить состояние как неизменное. Есть некий конечный автомат, который на вход принимает действие, а на выходе даёт новое состояние. Бездействие - это тоже действие. Поведение персонажа в прошлом - это журнал действий. Теперь нужно выбрать стратегию поведение персонажа на будущее. Обычно это делается с помощью деревьев решений. То есть у персонажа есть в каждый тик выбор из набора допустимых действий. Некоторые будут вести к нежелательным последствиям вроде смерти, такие ветки можно обрубать, а некоторые ещё позволят пожить какое-то время. Если дерево получается сильно ветвящееся, то можно ввести норма-функцию, которая будет давать эмпирическую оценку состояния. Персонаж должен выбрать путь в дереве допустимых решений с наименьшими рисками. Правильно понимаю. что помимо действий на судьбу персонажа влияет внешний Пуассоновский поток рандомных событий?
    Вот поэтому выбирается тот путь в дереве, который даёт максимальный запас живучести по каждому состоянию из всей цепочки прогнозируемого жизненного пути персонажа.
    При возникновении любого внешнего события дерево придётся очистить и перестроить заново. Можно кешировать его отдельные ветки по состоянию. Помним, что состояние у нас имеет смысл сделать иммутабельным (неизменным), тогда его можно использовать как простой бинарный хеш-ключ в кэше. Это может сэкономить много вычислительных ресурсов и памяти при сильно ветвящихся деревьях.

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

    Звучит как игра, которую кто-то "джва года ждал"=)
    Ответ написан
    Комментировать
  • Как ускорить решение задачи "Детский праздник"?

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

    А оптимизировать можно вот так.
    Давайте сперва представим, что надувальщикам не надо отдыхать и они шпарят каждый со своею скоростью шарики.
    Тогда можно сложить производительность каждого (1/t[i] -- шаров в минуту) и в сумме получим общую производительность толпы из N надувальщиков. Посчитать время теперь можно за один шаг по формуле.
    Теперь вспоминаем, что разные надувальщики будут в разное время отдыхать.
    Очевидно, что всё время их работы разобьётся на сегменты с различной производительностью, ведь надувают в рамках каждого сегмента разные надувальщики с разной собственной скоростью.
    Итак, первый сегмент будет с полной суммарной производительностью всех надувальщиков и длиться он будет вот сколько времени в минутах: T[j]=min(t[i]*z[i] for i in range(n)), но надуют они за это время много шаров с общей суммарной производительностью. В момент T[j] начнётся новый сегмент, в котором одного надувальщика не будет, он ушел на отдых и этот отдых будет длиться какое-то время r. Для следующего сегмента нужно посчитать новую производительность всех оставшихся участников. Можно из предыдущей производительности вычесть производительность выбывшего. Новый сегмент будет длиться, скорее всего, меньше. Нужно взять минимум между оставшимися временами работы оставшихся надувальщиков и временем r. То есть новый сегмент будет не длиннее r и продлится пока не выдохнется следующий из оставшихся надувальщиков. Так в каждом сегменте будет свой набор и своя производительность, каждый сегмент надует своё число шаров и как только оно перевалит за m нужно посчитать остаток последнего сегмента и сумма длин сегментов будет ответом.
    Ответ написан
  • Как в БД проверять есть ли такое значение?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Добавлю к предыдущему ответу, что можно по факту выполнения запроса посмотреть сколько записей добавилось в БД и исходя из этого вывести пользователю соответствующий ответ на команду "старт": https://peps.python.org/pep-0249/#rowcount
    Ответ написан
    Комментировать
  • Как связать ESP8266 и Алису?

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

    Итак какие соображения. У колонки есть возможность прикрепить телеграм-бота, и через него заставлять колонку что-то сказать в любой момент. Так можно заставить Алису объявить, что кто-то ломится в домофон.
    Также можно приделать с помощью реле и двухканального модуля Tuya приблуду, которая будет нажимать кнопку открытия двери. Но это как-то будет очень сильно похоже на велосипед из костылей.

    По-хорошему надо делать, чтобы через Алису можно было разговаривать по домофону и получилось какое-то законченное устройство, которое можно было поставить параллельно штатному домофону или вместо него. Тут я пока не знаю что предложить.
    Ответ написан
  • TypeError: 'class Meta' got invalid attribute(s)?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    verbase_name -> verbose_name
    Ответ написан
    Комментировать
  • Как воссоздать инлайн кнопки из базы данных?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Нужно написать код, который сделает инлайн кнопку на основе текста. Что тут непонятного? Всё ж очевидно.
    Ответ написан
  • Как оптимизировать сервер на python?

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

    Вот смотрю и вижу, что ваша задача очень похожа на задание. Если вы это написали самостоятельно, то должны были бы уже догадываться что с этим кодом не так. А так получается, что это не ваш код и вам задали вопрос как его оптимизировать, а вы пришли с этим заданием сюда. Так нельзя.
    Ответ написан
    2 комментария
  • Почему модуль winsound не воспроизводит звук?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    1) проверить пример из документации
    # Play wav file
    winsound.PlaySound('c:/windows/media/Chord.wav', winsound.SND_FILENAME)

    2) Убедиться, что по указанному пути есть файл и там нужный звук. Использовать полный абсолютный путь для начала, потом проверять текущий каталог.
    Ответ написан
    Комментировать
  • Как определить игрока быстрее всех нажавшего кнопку (web)?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Вам, похоже, не нужно какое-то абсолютное время. Достаточно отправить игроку сигнал и замерить локальное время реакции на этот сигнал по времени браузера игрока. Браузер игрока знает локальное время, знает когда пришел сигнал с сервера и знает когда отреагировал пользователь. Осталось отправить на сервер локальное время регистрации пришедшего сигнала от сервера и время реакции игрока.

    Минус у схемы только один, через отладочную панель можно жульничать.
    Чтобы жульничать было труднее, можно заставить клиенты подключиться к веб-сокету сервера и сигнал с реакцией прокидывать через него. Это тоже не убережет от жульничества с автоматизацией реакции.
    Наверно самое безопасное в плане жульничества решение потребовало бы стриминга видеопотока с физической реакцией игрока, а все подозрительные случаи выборочно потом проверять и модерировать людьми покадрово на предмет подделки видеосигнала.
    Ответ написан
    Комментировать
  • Ошибка аргументоа (мешает self), что делать?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    def download(link, path, mp, self):
    Нужно задекорировать метод как классовый или сттический. Если классовый, то надо указать первым аргументом cls
    Ответ написан
    Комментировать