Как стать автором
Обновить
29
0.2
Максим @danilovmy

Программист разработчик

Отправить сообщение

Сорри, @lorerv это я случайно минус поставил, а отменить не могу. Вернул в карму.

Просто хотел ответить, что сравнение времен некорректное. list comprehension всегда медленнее, примерно на 10%. Это хотели исправить, встроив функцию генерации списка в текущий контекст в этом pep

А почему получилось медленнее в тесте - ответит любой олимпиадник: на For-Loop после каждых 20 добавленных элементов вызывается memory allocation на следующие 20 элементов. Это заметно жрет время. Потому для задач олимпиад, где есть требование по времени при работе с массивом известной длины можно встретить:

mylist = [] * iterations # резервирование памяти сразу под весь список

Раз уж речь зашла про однобокость.

  1. FastApi+Alchemi+Alembic - а с чего такая рекомендация а не, напрмер, Litestar+PonyOrm ?

  2. почему предложен Poetry - a не Rye?

  3. Почему Pipenv а не conda?

  4. Почему Pytest а не Unittest

  5. C чего flake8 а не pylint?

@denis_py предложил универсальный набор для старта и я согласен, что с этого можно начать. Это в продолжение можно начать искать альтернативы, после осознания, что вырос из предложенного стека технологий, которых многим хватит за глаза на много лет вперед.

p.s. Я, например, давно перерос FastApi, пройдя его элегантность на старте, и встретив лютые костыли, когда стало надо делать что-то более сложное в проекте на over 300 000 строк кода. Можно посмотреть мои issues в проектах Pydantic v2 и FastApi. В конечном итоге мы в проекте переехали на Sanic. А чуть позже - на Litestar.

Gold Touch travel go2

Привет, спасибо за годноту. Забыли сделать раздел изменение угла наклона. У меня подставка с регулируемый углом наклона, с ним наконец то стало удобно - когда выставил максимальный угол наклона https://www.youtube.com/watch?v=UI3iHQif7rg

Рука практически как на вертикальной мыши лежит. У кого "тунель" - разница ощутима.

Не-а, не понятнее. В питон встроен sqlite, так что это часть python.

Посмотрел репо. Стало грустно. Такие макаронины без DRY в аггрегаторах это боль. Разумеется без тестов или чего то подобного. Не надо так. Ну или приватными такие репозитории стоит делать. CoPylot Ai же на этом учится, и потом мне подсовывает. А я предпочёл бы что-то более применимое к разработке.

Вот теперь точно! Ловите DevOpsa! Тут он!

p. s. Кстати, спасибо за идею!

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

Только я не понял, а в чем проблема длиных строк? На понимание алгоритма не влияет, я бы даже сказал, что и хорошо, что не в несколько строк, а то спагеттина станет еще длиннее. На быстродействие вроде тоже не влияет.

Все бы хорошо, но у иерархической системы квадратных сеток есть сильный недостаток - поскольку кодируются пары широты и долготы, то появляются различия в площади на разных широтах. Прям уух какие различия. В итоге uber, напрмер, создал свой spartial index H3. Их идея более жизнеспособна, и позволяет более точно кодировать координаты. Поиск по неточным координатам тоже возможен, правда, для случая z-curve есть ограничения. Я делал доклад по H3, несколько лет назад, удивлен, что кто то все еще использует S2.

поддерживаю. А я после сохранения accesstoken в localstorage.

Автор, @VlassaDasse, по коду получается, я не могу разлогиниться без токена? Как то это неправильно.

А вдруг я, как, админ, хочу сделать revoke_all_tocken_by_user? Как это работает?

Код вьюхи залогинивания уже есть в Django, зачем писать еще раз?

Если поставить защиту @permission_classes([IsAuthenticated]) на def profile(request, user_id) Методом перебора я могу получить профили всех пользователей. Я ж авторизован. Не надо так.

Ну и последнее. Зачем в данной реализации JWT, если django предоставляет auth by session? Ответ есть на хабре, и точно не в твою пользу :(

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

Привет, согласен с @molnij, микс очень странный. Напрягло еще в статье - упоминание asyncio. Вообще-то asyncio (а еще лучше curio) реализует кооперативную многозадачность (в статье ни слова). Причем это должны быть IO-bounded задачи, не вычисления.

<duschnila mode=on>

В питоне, как таковых корутин нет, есть генераторы. async def нужен питону для маркирования генератора как асинхронного и первичного запуска генератора, раньше маркировали декоратором @courutine. Маркировка async говорит о том, что в теле генератора может появиться await, кстати, await - это новая версия синтаксиса yield from для async генераторов.

</duschnila mode=off>

Но все равно, это знание никак не поможет статье, потому как асинхронное программирование в питоне, НЕ позволяет системе обрабатывать несколько задач одновременно. Всегда выполняется одна задача. В случае IO да, можно назвать выполнение "одновременным", но это происходит на отдельных контроллерах, в программе питона мы только проверяем флаги о завершении получения или передачи пакета данных.

Пропустим теоретическую часть, перейдем к практике. В Thread классе нет атрибута Thread.daemon есть Thread._daemonic (threading.py, ~905 строка). Потому у меня есть большие сомнения что все работает как планировалость. Я бы предложил такой вариант:

if __name__ == '__main__':

    loop = asyncio.new_event_loop()

    Thread(target=loop.run_forever, daemon=True).start()

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

algorithms.py вообще оставлю без комментариев, там жесть, конечно.

Недавно завершил работу в крупном медицинском data lake, ориентированном на EU, US, и Бразилию. Многое повидал, но вот этот пассаж статьи никак не укладывается у меня в голове. То ли плохой перевод, то ли написать, что бы написать:

После осмотра обезличенные данные передаются по зашифрованному каналу на нашу платформу для обработки. Шифрование также встроено в ПО комплекса и в дополнительный туннель на аппаратном уровне. Тем самым мы стремимся минимизировать возможность утечки персональных данных.

Данные обезличены. Их не надо шифровать. Они не представляют никакой ценности. Кроме того, объем данных таков, что вы просто захлебнетесь их кодировать-декодировать. Ну и последнее - если данные обезличены, то об утечке каких персональных данных идет речь?

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

Это же данные, о каких визуально похожих людях идет речь? У вас есть набор данных и признаки аномалии на наборе. Врач может, конечно глазками смотреть цифры, но он это сделает только при наличии уведомления об аномалии. Ни один нормальный врач не будет данные 2х миллионов пациентов в месяц просматривать лично. Потому и деанонимизация нужна только в случаях аномалии. Короче, если это реальная софтина, то явно это как-то по другому работает. Если это именно так и работает, то это не для людей созданная софтина.

Пассаж из статьи по ссылке подверждает дикость всей этой истории:

Если врач визуально не может с уверенностью определить личность пациента, это можно сделать с точки зрения обработки потоковых данных. 

У вас 2 миллиона пациентов в месяц. Врач не должен знать никого в лицо вообще. Нужны данные и знание про аномалии.

В общем - жуткая история. Если это правда, то врачей ваших жалко.

Спасибо за ответ.

  1. Meta.fields решено было сделать с помощью миксина, т.к. требовало только добавление нового родителя.

    Минимум это создание миксина, добавление строки импорта, правка в обявлении каждого сериалайзера тестирование и вызов кода на каждый реквест.

    Есть второй вариант - вы пишете функцию сбора полей, по модели и языкам.

    from django.conf import settings

    from modeltranslation.manager import get_translatable_fields_for_model

    def collect_translatable_fields(model_cls):

        for field in get_translatable_fields_for_model(model_cls):

            yield from (f'{field.name}_{lang}' for lang in settings.LANGUAGES)

    А потом импортируете функцию и прописываете в каждом сериализаторе

    class Meta:

    model = MySuperTranslatedModel

    fields = not, translatable, fields, *collect_translatable_fields(model)

    столько же линий правок, но код выполняется только на объявлении сериализатора. Но не на каждый запрос, пусть результат вычислений и закеширован. При сравнении -

    вы поменяете 0.1 сек не на 0.01 сек, а 0.1 сек на 0. Но конечно всегда есть контекст которого я в ващем случае не знаю.

  1. Если язык удалён - скорее всего это обдуманный шаг.

    Удален да. А еще бывает поставлен на паузу. В ModelTranslation - это невозможно, потому, что оно базируется на settings languages. Отключение языка необходимо, например, для изменения работы переводных URL через i18n_patterns. В этом случае modeltranslation добавляет/удаляет колонки с переводами в таблице. Это дичь. Нет ни одного другого settings, изменение которого меняет содержимое таблиц. Не добавляет или удаляет таблицы. Меняет колонки!!! Это последнее, что я бы ожидал от строчки в settings.

  2. У ModelTranslation есть косяки, но есть и плюсы - отсутствие дополнительных запросов в БД.

    Буквально вчера было обсуждение, что плюс - это когда хороший план исполнения запросов, а не когда один запрос или несколько. Я вот, например, всегда думал, что Join быстрее subquery. Пока не нашел статью IBM от 2004, что нет, не быстрее. И потом еще и сам проверил. Я к тому что считать кодичество запросов без плана так себе затея (https://habr.com/ru/companies/axenix/articles/787944/)

  3. Для status qwo - Django-TOF V2 updated 6 months ago. А так - написано независимо от версии питона, и от версии Django. Мне кажется, что качество репозитория характеризуется не тем, насколько регулярно происходят правки, а насколько много еще открытых issues. Косяк пока знаю один, сортировку по значению переводного поля не сделал, поскольку у разных переводов свой fallback у каталонского - fallback испанский и только потом английский. в Modeltranslation про многослойный fallback даже не слышали.

  4. "Proxy". Ваш пример очень упрощен. Если расширить этот пример до класса.

    Мой пример позволяет получать как текущий перевод shape.transfield, так и любой языковой shape.transfield_en например. А еще, class Proxy работает, как очень любопытный миксин, всячески рекомендую изучить. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

  5. Этот объект отправить всем подключенным пользователям по WS, на том языке, который у него активирован.

    WS соединение всегда можно открывать со статусом языка. Слать сообщение если язык поменялся на клиенте, и передавать минимум информации. А то, какой язык на клиенте, вы скорее всего и так знаете, поскольку сообщения от пользователя, вероятно, приходят на каком одном языке и не переведенные на все. Если нет, то это какое то странное мультиязычное бизнес решение. Поделитесь ссылочкой посмотреть и поучиться.

  6. this.name = data; this.desc = data.

    Ээ. Не надо так. Может лучше this.data = data. а get/set дескрипторов просто обращаются к this.data ?? Ну иначе overhead получается.

В общем, чего я тут спорю? У вас есть решение, которое пока работает и решает задачу. Так и прекрасно! Я заметил сложности, которые вам еще предстоит решить... или нет. Всякое бывает. Удачи проекту и поделитесь ссылочкой на посмотреть.

У меня нет задачи доказать, что все неправильно, но пару моментов вам точно стоит обдумать уже сейчас, что бы не мозолить пятую точку позже:

Back-end:

  1. ModelTranslation базируется на статических данных в settings.py - LANGUAGES, и в файле регистрации переводов в ModelTranslation. В итоге данные по переводным полям каждой модели и языкам существует еще до старта проекта. Это значит, что объявить Meta.fields можно уже на этапе объявления класса, а не выполнять бессмысленно одну и ту же работу на каждой инициализации сериализатора: get_fields() вызывается на __init__. Ну или хоть закешируйте результат.

  2. У ModelTranslation есть скрытый косяк, при работе с языками - если язык удален, то после миграции будет снесена колонка переводов на этот язык. Т.е. Один из языков нельзя временно поставить на паузу. Вы поймете, как это важно, когда у вас языков будет много, а переводчики работают не так быстро как хочется.

  3. Посмотрите исполнительность кода на 10 переводных полях модели, на 10 языках. Вероятно, сразу после этого захотите что-то поменять. Передположу, что могут появиться несколько сериализаторов для одной и той же модели.

  4. Поскольку я совсем разлюбил ModelTranslation за 6 лет работы с ним, я создал DAJNGO-TOF, уже есть полностью переписанная V.2. Вам, вероятно, пригодится. Там статика переводится, json языковой для Vue-i18n генерится, статика с фронта тоже собирается на перевод.

Front-End:

  1. Вместо лютого хардкода в c моделями используйте Proxy. Почему это хорошо? Потому, что всего несколько строк кода:

    let handler = {

    get(target, name) {

    let lang = 'en' // define somehow your lang

    return target[`${n}_{lang}`] || target[n]

    }}

    def Shape = Proxy(shape_object, handler)

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

  2. Cписок переводных полей отдельная тема. У вас на бэк поля на перевод в своем списке добавляются, а на фронт в своем списке. Если проект большой и растет и работают несколько команд - ой полыхнет когда нить. Оно всегда когда-нибудь полыхает, но с переводными полями этого точно можно избежать назначив one_source_of_truth.

  3. Мой совет. не передавайте все переводы. ЭТО НЕ НАДО! У нормального клиента происходит максимум один раз переключение в языках, это если вы плохо определили язык клиента до старта. Или переключение между двумя в очень редких случаях, когда он сознательно что-то сравнивает (название ингридиентов рецепта, побочные действия медикамента и т.п.). Если кеширование настроено нормально и руки норм, то все работает без доп запросов. Для проверки, может я шучу, опять же поработайте с объектами 10 полей, 10 переводов - и залогируйте сколько процентов информации было использовано.

  4. Не понял прикола с this.name = this.getField(data) , у вас это уже дескриптор, зачем еще обертка?

В общем все очень странно, и выглядит, что вы, или еще это не тестировали, то ли вам все равно, потому как 2 языка и одно переводное поле и вы еще ничего не заметили.

Успеха в любом случае.

Вроде статья про экстремальные практики, а про правку кода на проде под нагрузкой через CLI ничего не сказано.

Привет, пишу с такого же. А не напрягают кнопки стрелок вверх вниз. Я все время вместо вверх shift нажимаю. Но вопрос в другом - как отключить выцветание экрана при уменьшении заряда? Подключить кабель не предлагать!

Принимается, согласен что субьективно. Мне никак не удается серьезно воспринимать миссии, в которых, в том числе, отправка мемориальных капсул содержащих переработанные части человеческих тел. Хотя планы лунной фазы были очень привлекательные.

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

Кстати, для меня, этот проект выглядит каким то лютым скамом с начало и до конца. Начиная с причины отправки, и всего процесса полета/недолёта. Никто даже проверить и подтвердить не может, что peregrine существовал, или мог выполнить те задачи, что были на него возложены, или что он их выполнял, и в итоге он их и не выполнил. Я понимаю, что это можно сказать про все неуспешные проекты связанные с космосом, но именно в этом случае - выглядит все очень подозрительно.

Не успели, Говорят им очень мешали древние Русы

Спасибо, но нет. CIO, это Chief Information Officer. Или директор по информационным технологиям, в переводе. А то, что ты делаешь на этой должности зависит от компании.

Информация

В рейтинге
1 980-й
Откуда
Zams, Tirol, Австрия
Дата рождения
Зарегистрирован
Активность

Специализация

Backend Developer, Fullstack Developer
Lead
От 7 000 €
Python
Django
Ajax
OOP
Design patterns
Vue.js
JavaScript
HTML
CSS