• Есть ли для Vue плагины по работе с websocket'ами, которые позволяют получить ответ сервера после отправки сообщения напрямую?

    @deliro
    Что значит "получить ответ напрямую"? Вебсокеты — асинхронное общение. Здесь нет принципа "запрос-ответ". На них можно сделать такое поведение, как и на любом асинхронном общении, используя correlation id.

    Например, ты посылаешь сообщение серверу с данными
    {"request": {"x": 123, "y": 123.45}, "id": "1234567"}
    , где id должен быть достаточно уникальным в пределах вебсокета. Например, последовательность натуральных чисел.

    И ты также ожидаешь, что ответ сервер вернёт с этим же id. Например, такой:
    {"response": {"x": 321, "y": 45.321}, "id": "1234567"}


    В это случае можно сделать что-то вроде такого:

    class WSHandler {
        constructor(ws) {
            this.ws = ws;
            this.sequence = 0;
            this.waiters = {};
        }
    
        onMessage(event) {
            const { data } = event;
            const { id } = data;
            if (!this.waiters[id]) {
                throw new Error(`No waiter for response #${id} was found`);
            }
    
            this.waiters[id](data.response);
            delete this.waiters[id];
        }
    
        sendRequest(requestData) {
            const id = this.sequence++
            const msg = {id, request: requestData};
            this.ws.send(msg);
            return new Promise(resolve => {
                this.waiters[id] = resolve;
            });
        }
    }
    
    ...
    
    const handler = new WSHandler(new WebSocket('wss://...'));
    const response = await handler.sendRequest({"hello": "world"});
    Ответ написан
    Комментировать
  • Как выполнить агрегационный запрос в Django?

    @deliro
    Нет группировки по number, потому что есть группировка по number, type.
    Ответ написан
  • Как устроена скорость в играх?

    @deliro
    Комментировать
  • Реализация автополива с Arduino, если ты ничего не знаешь?

    @deliro
    Раз https://youtu.be/B0893sJCs44
    Два https://www.youtube.com/watch?v=3suqsclnWiI
    Да и в целом три https://alexgyver.ru/

    Буду благодарен, если подскажите, как проблемы могут быть с реализацией такой системы и что мне понадобиться.
    В голове звучит как-то так - Arduino, клапан (Открытие/Закрытие воды) и датчик температуры, влажности и времени, но полагаю, что на практике - это будет непросто. Хотелось бы ещё взаимодействия с API.

    Arduino Nano для контроля. Ничего другого типа Uno не бери. У нано очень удобная посадка на макетку, она дешевле и по ресурсам тоже самое
    Макетка
    Рассыпуха в виде резисторов разных номиналов, кондёров и прочего
    Термистор не нужен, если на основе температуры ничего не происходит (а у тебя, кажется, так и будет)
    Помпа(ы) для прокачки воды
    Реле или MOSFET'ы для контроля помпы/освещения/открытия окон. Потому что через ардуину нельзя питать ничего мощнее светодиода
    Клапаны на соленоидах, если разные растения требуют разного уровня влажности и разного гистерезиса. Это дорого
    Или клапаны, которые регулируются руками. Неточно, нетехнологично, зато дёшево
    Датчики влажности с драйверами. Бери с запасом, они быстро выходят из строя
    Датчик реального времени, если системе важно не только опираться на данные датчика влажности, но и на прошедшее время и система почему-то будет часто вырубаться (кратковременное отключение электричества). В целом он не очень нужен
    Дисплей по желанию для отображения данных / настройки системы вручную кнопками
    Кнопки, если хочется настраивать вручную, а не через код (например, текущие данные с датчика влажности принять за сигнал к поливу, изменить время опроса датчиков, время полива и т.п.)
    Батарейный отсек например для 18650 с контроллером питания, если хочется питать ардуину автономно

    Взаимодействие по API (если подразумевается что-то с HTTP, JSON и т.п.) — сложно и непонятно зачем. Но если надо, то надо вайфай для ардуины, реализовывать HTTP и вот это всё. Вероятно, проще взять 2.4ГГц радио трансиверы и общаться ими. Или даже подключить ардуину по USB к компу, слать по Serial данные, а ПК уже использовать для того, для чего ты хотел бы использовать API
    Ответ написан
    3 комментария
  • Обязателен ли Nuxt в связке с Vue?

    @deliro
    Нет
    Ответ написан
    Комментировать
  • Использовать ли DRF?

    @deliro
    В DRF логику не делают и через DRF логику не делают. DRF — это слой контроллеров и слой отображения. Он делает за тебя грязную работу в виде ACL, маппинга сущностей туда-обратно между ORM и JSON, фильтры там всякие. Логику ты пишешь в сервисах или моделях

    Но DRF использовать скорее стоит, особенно в начале разработки
    Ответ написан
    Комментировать
  • Почему нельзя вернуть так структуру?

    @deliro
    Почему в функции, которая должна вернуть интерфейс, нельзя вернуть структуру, реализующую сам этот интерфейс?

    Конечно можно: https://play.golang.org/p/ximR1mGUaAg

    Но то, что ты показываешь в коде, называется ковариантностью, в которую го не умеет. Это проблема языка. Решается или вот так: https://play.golang.org/p/RrHMV2neUvp или явным кастом, в зависимости от случая.
    Ответ написан
    Комментировать
  • Как передать $ref из дочернего компонента в родительский?

    @deliro
    Не нашёл, потому что так не стоит делать. Вниз передаются пропсы, вверх - ивенты. $ref используется крайне редко и это вообще костыль. Прямого доступа к DOM скорее всего не нужно (но зависит от кейса)
    Ответ написан
    Комментировать
  • Как реализовать бинарный поиск в базе Django?

    @deliro
    1. Очень сомневаюсь.
    2. Запрос Names.objects.get(name=name).count прекрасно использует индекс, если ты его, конечно, создал. 14 миллионов строк для индекса, тем более, уникального — очень мало. А если не создал, то это фулскан и очень долго
    Ответ написан
    4 комментария
  • Как получить сырой запрос к БД, когда получаем данные путем Model.objects....?

    @deliro
    Если возвращается QuerySet (а не объект, как в случае .first или .get), то у QS есть атрибут .query

    str(Model.objects.filter(...).values_list(...).query)
    Ответ написан
    Комментировать
  • Как внести данные с '?

    @deliro
    Бэкслэш чтоли не знаешь?
    Ответ написан
    3 комментария
  • Какой стек технологии выбрать для сайта объявлений с посещаемостью до 500.000 в день?

    @deliro
    Зачем брать PHP для создания с нуля?

    12млн просмотров в день, если вспомнить типичное распределение нагрузки, выльется в пиковые 500-1500 RPS. При этом, большая часть времени будет тратиться на ожидание IO — базы данных и кэши. Что уже говорит о том, что язык должен поддерживать асинхронность, гринтреды, акторы или что-то подобное. Причём, 1000 RPS — это уже достаточно много, чтобы задумываться об оптимизациях и, возможно, горизонтальном масштабировании. И это, пожалуй, единственное требование для вашего продукта.

    Я бы брал Golang, как хороший компромисс между производительностью, надёжностью и скоростью разработки. Но нужно понимать, что плохо написать можно на любом инструменте.

    UPD.
    Я не рассматриваю Golang, как "преждевременную оптимизацию", а наоборот, как инструмент, который позволит отсрочить необходимость оптимизации.
    Ответ написан
    7 комментариев
  • Чем веб-парсеры отличаются от реальных пользователей?

    @deliro
    1. Количеством запросов
    2. Нехаотичностью запросов
    3. Отсутствием рантайма для JS
    4. Либо присутсвием рантайма, но отсутствием натурального движения мышью
    5. Списком IP из ренжа AWS/DO/Vultr и других хостингов. Пользователи не сидят с таких IP адресов или делают это очень редко (купили и настроили там VPN)
    6. Резкими всплесками активности из одного сегмента сети (следствие 1 и 5 пунктов)
    7. Капча
    8. Что угодно ещё, хоть fingerprintjs

    Какая конкретно детектилка ботов стоит — сложно сказать. Либо измерять эмпирически, либо подкупить разработчиков оттуда, либо терморектальный криптоанализ. Но в любом случае, это должно стоить дешевле, чем информация, которую ты пытаешься попарсить
    Ответ написан
    Комментировать
  • Как сравнить строки в цикле Python?

    @deliro
    БРАТ ИСПОЛЬЗУЙ ВОТ ЭТУ ФУНКЦИЮ БРАТ i.startswith("plv")
    Ответ написан
    3 комментария
  • Почему Uvicorn советуют запускать через gunicorn?

    @deliro
    Потому что uvicorn - это не менеджер процессов. Он запускает ровно один процесс, в котором будет один ивент луп, который будет всё крутить на одном ядре. Если у тебя 4ядерный проц на сервере, то для полной утилизации ресурсов нужно запустить как минимум 4 таких uvicorn’ов. Для этого gunicorn здесь и нужен.
    Ответ написан
    Комментировать
  • Что такое Доменный объект и Предметная область, простым языком?

    @deliro
    Предметная область — множество всех сущностей и их отношений в рамках контекста.

    Например:
    В рамках магазина это покупатели, продавцы, товары, цены, скидки, поставщики, процесс продажи, прихода на склад, возврата и т.п.
    В рамках дискорда это пользователи, серверы, комнаты, группы, права на доступ, процессы присоединения к серверу, входа в комнату, оплаты nitro, написания текстового сообщения и т.п.

    В целом, это всё, что понимает твой менеджер и ничего, что он не понимает. В предметную область не входит, например, то, где именно ты хранишь данные — в mysql, в файлах, получаешь и сохраняешь их по API или хранишь их в redis'е. Но входит абстрактная сущность "хранилище". Она же — интерфейс репозитория. Репозиторий — это паттерн, который скрывает реализацию конкретного хранилища и который оперирует объектами доменной модели — элементами предметной области, как будто они хранятся у тебя в оперативной памяти. Например, у репозитория могут быть методы
    users.getByID(1234), users.save(user), users.getByEmail("hello@world")
    и т.п. Реализация репозитория определяет, куда именно сохранится этот user или откуда он скачается. В одну таблицу или в несколько. Нормализованные ли будут данные лежать в РСУБД или денормализованные. Именно здесь можно реализовать запись в master, а чтение с реплик. Или энкодинг в msgpack и передачу его по API куда-то. Или по gRPC. Потому что предметная область не должна перегружаться деталями реализации хранилищ.

    Про доменную модель:
    Словарь (он же хэш, он же ассоциативный массив) — это не доменная модель (хотя в некоторых функциональных языках может быть). Объект ORM — это тоже не доменная модель, хотя много где пытается ей быть. Доменная модель не зависит от конкретных фреймворков, баз данных, оптимизаций этих баз и прочих навязанных технической составляющей сущностей. Чаще всего это обычный класс на языке, на котором пишется код (или struct в случае Golang).

    Недавний пример:
    У сущности есть теги по категориям:
    {"category1": ["foo", "bar"], "cat2": ["foo", "hello", "world"]}
    . Их так удобно представлять на уровне предметной области, об этой структуре я могу общаться с заказчиком. Но в монге они сохраняются в виде
    ['category1%%foo', 'category1%%bar', 'cat2%%foo', 'cat2%%hello', 'cat2world']
    , потому что так их легче индексировать и быстрее по ним искать. Но это скрыто в реализации репозитория, доменная область про это ничего не знает. Это даёт сразу много преимуществ:
    1. Это очень просто тестировать, без всяких моков. Вместо репозитория с монгой я делаю репозиторий, который хранит сущности в оперативе. Всё, тесты бизнес-логики не зависят от инфраструктуры. А репозиторий монги я тестирую отдельно, мокая запросы в саму монгу или даже не мокая
    2. Это облегчает понимание всего продукта. Мозг не пытается составить полную картину, когда запросы в БД перемешаны с логикой, тут же сплиты-джойны строк, какие-то ещё низкоуровневые действия. Мозгу легко ориентироваться в пределах уровня. На уровне репозитория я думаю о том, как сущности хранить и доставать из хранилища, на уровне служб я думаю о том, как сущности взаимодействую и какие их них нужно извлечь/сохранить, но не как
    3. Рефакторинг очень простой. Даже теоретическая смена БД. Завтра с монги нужно будет перенести одну сущность на постгрес — без проблем. Я напишу один новый репозиторий, не затронув ни строчки кода за его пределами, кроме места, где он создаётся. При этом, остальные сущности могут лежать всё также в монге

    Доменные модели бывают богатыми и анемичными (но не бескровными). Оба подхода применяются и, имхо, не является антипаттерном ни один из них. Лично я использую анемичные модели, а всю бизнес-логику храню в службах.
    Ответ написан
    2 комментария
  • Django DRF. Из-за чего возникает ошибка при использовании метода POST и PATCH?

    @deliro
    Это разные content types. django.contrib.contenttypes — это метаинформация для внутренностей джанги.

    Content-Type, который тебе нужен — это HTTP header. POST запрос с формой требует один из трёх Content-Type'ов: application/json, multipart/form-data или application/x-www-form-urlencoded в зависимости оттого, что ты отправляешь.
    Ответ написан
    Комментировать
  • Как контролировать сколько было создано экземпляров класса?

    @deliro
    class X:
        _created = 0
    
        def __init__(self):
            X._created += 1
    
    for _ in range(10):
        X()
    
    print(X._created)
    Ответ написан
    Комментировать