• Планирую перейти с 1С на Golang на сколько реально в 42 года?

    @deliro
    Не могу сказать, насколько 1Снику в 42 будет легко перейти в го, но с питона на го перейти в 25 оказалось крайне просто.

    Go — очень простой язык, без сложной системы типов, без большого количества костылей и подводных камней. Но что более важно, сейчас Go специалистов на рынке дефицит, а крупные игроки вроде мейла, озона и подобных пылесосят весь рынок. Так что, без работы не останетесь, если за эти 20 лет вы не остались джуном. 2.5к — это примерно зарплата мидла, так что, можно предположить, что просадки не будет. Опять же, если вы за 20 лет не остались джуном.
    Ответ написан
    7 комментариев
  • TypeError: sender() takes 1 positional argument but 2 were given, что не так?

    @deliro
    61e8712a70e39106732387.png
    Я бесконечно буду удивляться тому как (а главное — зачем) вы пишете ботов без малейшего понимания инструмента (языка). Неужели вам, неучам, так сложно прочитать да хотя бы https://learnxinyminutes.com/docs/ru-ru/python-ru/

    Это же ровно 5 минут вашего драгоценнейшего времени. Но нет. Мы будем долбиться в стену, писать чушь на языке, которого не знаем копипастой из туториалов, в которых ничего не понимаем, тратить кучу своего времени впустую и бежать писать совершенно одинаковые вопросы на тостер, каждого из которых тут уже было по тысяче раз и, внимание, все они проходятся ровно одной (любой) книгой по питону. НО НЕ ЧИТАТЬ ЖЕ, ведь глазки устанут.
    Ответ написан
    1 комментарий
  • Чему учит Марк Лутц?

    @deliro
    и не совсем понимаю необходимости чтения книг.

    Ну тут ты конечно хорошо пошутил:)

    Прочитай Fluent Python, раз Лутц слишком прост. А вообще, в питоне нет чего-то такого, что нужно прям "изучать". Лучше потратить время на дядю Боба с его Чистым кодом и Чистой архитектурой.
    Ответ написан
    4 комментария
  • Какой сервис использовать для бесплатного хранения видео для бэкенда на Django?

    @deliro
    Никто не будет хранить ваши огромные данные бесплатно, это никому не нужно. Пусть даже вы сделаете хитрую схему из сотен яндекс-аккаунтов и сделаете агрегатор яндекс.дисков, вас забанят очень скоро, когда увидят, что трафика на чтение очень много и он из самых разных мест. Или что он кратно превышает среднего юзера по больнице. Или что вы в кучу аккаунтов ходите через один IP адрес.
    Ответ написан
    Комментировать
  • Как в коде в стиле "clean architecture" использовать транзакции?

    @deliro
    Нужно понимать, что orderRepository и paymentRepository — это абстракции, а фактически данные могут храниться как в одной базе, так и в совершенно разных. Например, orderRepository находится на сервере S1 в базе Redis, а paymentRepository — на серверах S2, S3, S4 в базе PostgreSQL. Поэтому, классические транзакции здесь неприменимы. Этим можно пренебречь в большинстве случаев и не переусложнять систему, а можно пойти "правильным" путём и использовать распределённые транзакции, например, саги https://microservices.io/patterns/data/saga.html
    Ответ написан
    1 комментарий
  • Почему горутина так мало весит?

    @deliro
    В то же время, они основаны на системных потоках, размер которых не меньше 1Мб.

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

    Так вот, поток далеко не равно горутина. У потока системный стек, у горутины — какой захочет рантайм го.
    Ответ написан
  • Как обычно логируют краши от паник?

    @deliro
    Sentry же
    61e1af6871d43200258930.png
    Ответ написан
    Комментировать
  • Как узнать сколько времени займет поиск значения в тхт-списке?

    @deliro
    Как понять сколько времени будет занимать поиск заданного значения и каким способом эффективнее парсить файл?

    Что известно о файле кроме того, что он есть?

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

    Если в нём значения отсортированы по какому-то признаку и есть явный разделитель (перевод каретки, например), то можно сделать аналог бинарного поиска (за O(logN)). Ну то есть, тыкаем в середину файла (seek(file_size_in_bytes / 2)), ищем вперёд ближайший разделитель (например, перевод каретки), читаем до следующего разделителя (получается строка), сравниваем ну и дальше как обычно. Но нужно учесть, что если это HDD, то движения головки диска не бесплатные и рандомный seek будет медленней последовательного, так что сравнивать "количество строк в секунду" в лоб не выйдет.

    Если ОЗУ позволяет, то можно вычитать весь файл туда и закинуть в структуру, которая больше подходит. Будь то дерево, сортированный массив или хэш-таблица. Если требуется только ответ на вопрос "есть?", то хэш-таблица будет самым производительным вариантом со сложностью O(1)

    Если ОЗУ не позволяет и большинство запросов заведомо будут "мимо", можно сделать фильтр Блума и сканировать файл только если он "возможно есть" и никогда не сканировать, если его "точно нет" (собственно, эти ответы и даёт фильтр Блума)

    Если ОЗУ не позволяет, но файл можно менять, то можно отсортировать его единоразово и дальше бинарный поиск

    Да можно даже содержимое файла в sqlite залить и решить все проблемы, пусть драйвер сам разбирается, что хранить в ОЗУ
    Ответ написан
    Комментировать
  • Как отфильтровать список и удалить дубликаты?

    @deliro
    0. Создаёшь пустое множество S
    1. Идёшь по списку
    2. Строку делишь на страну-язык
    3. Проверяешь, что язык не в S
    4. Добавляешь его в S и в результирующий список

    Хорош элементарные вопросы строчить по фундаменту языка и CS в целом

    Ну и как сказал Игорь Маркин, у тебя несколько вариантов, какой строке отдать предпочтение. Первой, последней, рандмной, какой-то ещё? Мы за тебя решать будем?
    Ответ написан
    2 комментария
  • Как в множествах каждое слово брать за новый обьект?

    @deliro
    a = {x.strip() for x in input().split(",")}
    b = {x.strip() for x in input().split(",")}
    print(b - a)
    Ответ написан
    Комментировать
  • Не могу сделать миграцию, как это решить?

    @deliro
    Ты добавил поле, поле это не может быть NULL. Но в базе уже могут находиться записи, которые, очевидно, не содержали этого поля (потому что ты его только что добавил). А значит, всем существующим записям нужно что-то поставить в это поле.

    Хотя достаточно было перевести текст, там ведь тоже самое написано.
    Ответ написан
    5 комментариев
  • На какой платформе изучать Python 2?

    @deliro
    где можно изучать Python 2?

    В 2008 году

    Желательно в бюджетном сегменте, ведь деньги у меня не резиновые.

    Потратил на изучение питона за все 8 лет 2000р — купил Fluent Python спустя пару лет после начала обучения, когда уже работал
    Ответ написан
    Комментировать
  • Какой вариант построения условий производительнее?

    @deliro
    Очевидно, первый потребляет меньше памяти. Также он будет быстрее как минимум потому, что построение списка — это долго и дорого по сравнению с простейшим сравнением равенства.

    Но это всё спички, а ты на них экономишь. Если ты выбрал питон, то про слово "производительность" забудь в 99% случаев. Да и вообще, (почти) любой код — про читаемость прежде всего. Да, есть места вроде ядра linux, драйверов, embed и т.п., где пишут нечитаемый код, лишь бы выполнялось быстрее. Но питон от этого настолько далеко, насколько можно представить, только ещё чуть дальше.

    P.S. операция in над списком обычно не выполнятся, т.к. очевидно, сложность будет O(n). Если элементов списка не три, а значительно больше, то стоит заменить на set. Так и читабельней и быстрее.
    Ответ написан
    Комментировать
  • Как наиболее эффективно сравнивать две переменные с третьей?

    @deliro
    Это лучший вариант. Никто не видит здесь ничего колхозного кроме тебя
    Ответ написан
    Комментировать
  • Npm, Webpack, NodeJs с чего начать?

    @deliro
    Фронт развился в какую-то неправильную сторону, это правда
    Вкатиться на фронт очень сложно, это тоже правда. Причём, необоснованно сложно.

    Я бы выделил два пути, как можно въехать во всё это:
    1. Создать приложение на Vue или React по туториалам, затем разобраться, как и зачем оно всё
    2. Разобраться как и зачем оно всё (aka Vanilla JS), потом заняться реактами

    Имхо, вариант №2 предпочтителен и более прост, потому что на варианте №1 есть огромный шанс застрять, никогда не разобравшись, как оно работает а при любых нешаблонных ошибках поднимать лапки.

    Что здесь нужно понимать:
    1. Есть разные версии ES (ecmascript), они все обратносовместимые. Программист может писать на любой версии, какая ему нравится. Обычно берут последнюю стабильную

    2. Для проекта обычно есть две версии ES: та, на которой пишут программисты и та, которая исполняется в браузере или в ноде (об этом позже). Например, программист пишет на ES8, а код транслируется на ES5. Это позволяет использовать последние предсмертные хрипы писки моды JS при этом запуская всё на древнейшем говне вроде IE11. Перегонкой кода из JS/TS одной версии в JS другой версии занимается транспилятор: babel / esbuild / swc

    3. Новые версии JS содержат расширения стандартной библиотеки, которых нет в старых браузерах (например Array.from, Object.entries и т.п.). Эти дырки затыкают полифиллы, они же shims. Самая популярная дырозатыкательная машинка — corejs

    4. Весь код очевидно не пишется в одном файле и может быть написан на TypeScript (он же TS), JSX/TSX (реактовый синтаксис). Всё это нужно собрать в один или несколько файлов, то есть скомпоновать. Этим занимается bundler: часть webpack / esbuild / spark / etc.

    5. Этот же парень отвечает за то, чтобы та тысяча библиотек, что лежит в node_modules, попала в итоговый условный main.js, но не целиком, а только то, что используется. Последнее называется tree shaking (типа навозную кучу node_modules потрясли как дерево, что упало — то не нужно)

    6. (то самое "позже) Код может исполняться не только в браузере пользователя, но и на сервере без браузера вообще. Это нужно для SSR aka Server Side Rendering. SSR — это такой глобальный вонючий костыль для SEO. Дело в том, что стандартные SPA приложения содержат один DOM элемент, куда цепляется всё остальное приложение вроде реакта или вью, которое уже содержит всю вёрстку прямо в JS. Но не все поисковики согласны с таким подходом и некоторые (не будем показывать пальцем на яндекс) не умеют выполнять JS и индексируют только тот самый единственный DOM элемент, который существует на этапе отдачи страницы в браузер. Это уже потом к нему JS движком дорисовывается весь остальной сайт. Соответственно, сайт индексируется от слова "никак", а некоторым это важно. Например, когда SPA — это не админка. Для этого есть два выхода: страницы, важные для SEO, рендерить чем-то не-реактовым или сделать SSR — делать за яндекс работу на сервере (на ноде), представляя в уме, что у нас есть DOM и браузер (на самом деле нет), на выходе получать начальное состояние HTML, отдавать его клиенту (браузеру или поисковому роботу), а JS'ом её т.н. "гидрировать", иными словами — оживлять.

    7. webpack отвечает за всё вот это сверху в том или ином виде. Это такой кухонный комбайн, в который вкидываешь кучу хлама в одном виде, а получаешь другую кучу хлама в другом виде.

    Начать советую с parceljs, который сильно проще в освоении, чем webpack. И на написании кода максимально без библиотек.
    Ответ написан
    1 комментарий
  • Page not found Django - Как исправить?

    @deliro
    Читаем внимательно и вдумчиво https://docs.djangoproject.com/en/4.0/topics/http/urls/
    Ответ написан
    Комментировать
  • Django 4 - как удалить файл при удалении из админки?

    @deliro
    Что значит "как"? Ответь на вопрос: как получить все файлы, связанные с моделью? Вот теперь оформи это в метод модели

    def get_all_my_files(self) -> list[str]:
        result = []
        result.extend(get_from_here())
        result.extend(and_from_there())
        return result


    И повесь на pre_delete сигнал получение файлов, а потом удаление
    Ответ написан
    Комментировать