• Где, когда, зачем и почему надо применять DTO?

    @kttotto
    все, что .NET
    1. DTO модели, это всего лишь прослойка между сервисами и их предназначение перенести данные от одного сервиса/слоя к другому. Это всегда чистые POCO модели. Если Вы из одного сервиса сразу будете передавать данные в другой сервис, то у Вас выйдет зависимость от типа данных. Т.е., если в первом сервисе изменится тип отдаваемых данных, то придется менять тип входных данных второго сервиса и возможно что-то даже править в коде.

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

    Конечно же DTO слой добавляет сложности проекту. Во первых лишний слой, лишние классы, во вторых нужны правила мапинга от одного сервиса к DTO и от DTO ко второму сервису. Поэтому это все оправдывается на крупных долгоживущих проектах с большим ожиданием изменений.

    Собственно по поводу конкретики применения я ответил: перед тем как отдать данные - мапите в DTO, получили DTO - сразу мапите в локальные модели. Больше внутри нигде их не используете, они только переносят данные.

    2. Фабрика нужна там, где нужен контроль создания объекта. Либо ограничение прав его создания, либо принятие решения создания по условию и.т.д.
    Ответ написан
    Комментировать
  • Полнотекстовый поиск в Windows 10?

    PowerShell
    Get-ChildItem “S:\Folder\” -recurse | Select-String -pattern “Text” | group path | select name


    Сам не сразу вспомнил что PowerShell мощь :)

    Даже еще круче, с Windows XP cmd

    find "Text" S:\Folder\*

    UPD: Оказывается в Windows 10 при поиске в папке, есть на вкладке поиск есть дополнительные параметры. В которых можно указать поиск в файлах и архивах ZIP. Так что все есть, дополнительное ПО не требуется.
    Ответ написан
    Комментировать
  • Почему при установлении атрибутов width и height в поле модели ImageField выдается ошибка?

    @marazmiki
    Укротитель питонов
    Потому что эти артибуты не задают ширину и высоту рисунка. Они задают названия полей, в которые джанга запишет актуальную ширину и высоту загруженной картинки. Типа того:
    class MyModel(models.Model):
        img_width = models.PositiveIntegerField(null=True)
        img_height = models.PositiveIntegerField(null=True)
        image = models.ImageField(upload_to='photos', height_field='img_height', width_field='img_width', max_length=100)
    Ответ написан
    1 комментарий
  • Как переключить язык в vs code?

    vabka
    @vabka
    Токсичный шарпист
    1. ctrl+shift+p
    2. configure display language (Настройки языка интерфейса)
    Ответ написан
    Комментировать
  • Почему скомпилированный код в pyinstaller считается вирусом?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Потому что он на самом деле не скомпилирован. Утилиты типа pyinstaller, cx_Freeze и тому подобные просто создают самораспоковывающийся архив, содержащий интерпретатор и ваш скрипт. Запуск упакованного в исполняемый файл кода - это как раз то поведение, которое свойственно для вирусов.
    Ответ написан
    2 комментария
  • Что за ошибка при push в Git?

    druid3
    @druid3
    ...еще вариант использовать опцию --force (-f) - игнорирует эту ошибку в частности...
    Ответ написан
    2 комментария
  • Почему зависает send_email?

    kentuck1213
    @kentuck1213
    EMAIL_USE_TLS = True замените на EMAIL_USE_SSL = True
    Плюс порт не правильно стоит :
    Исходящая почта
    адрес почтового сервера — smtp.yandex.ru;
    защита соединения — SSL;
    порт — 465.
    587 замените на 465
    Ответ написан
  • Получить slug в children mptt?

    @blazer05
    Я так делал
    {% recursetree categories %}
                                <!-- блок аккордеон -->
                                <div class="accordion">
                                    <section class="accordion_item">
                                        <h3 class="title_block"><strong>{{ node.name }}</strong></h3>
                                        {% if not node.is_leaf_node %}
                                            {% for child in node.children.all %}
                                                <div class="info"><hr>
                                                    <ul>
                                                        <li class="info_item"><a href="{% url 'shop:catlist' child.slug %}"><u>{{ child.name }}</u></a></li>
                                                    </ul>
                                                    {% recursetree child.children.all %}
                                                        <ul>
                                                            <li class="info"><a href="{% url 'shop:shop-list' node.slug %}">{{ node.name }}</a></li>
                                                        </ul>
                                                    {% endrecursetree %}
                                                </div>
                                            {% endfor %}
                                        {% endif %}
                                    </section>
                                </div>
                                <!-- конец блока аккордеон -->
                            {% endrecursetree %}
    Ответ написан
    1 комментарий
  • Почему конвертация двух похожих файлов из mp4 в webm дает очень разные результаты?

    nidalee
    @nidalee
    Во-первых, если ваш энкодер умеет CRF, CQP и прочие адаптивные битрейты \ стратегии энкодера, нужно использовать их. О стратегиях энкодера (Encoder Strategy \ Rate Control \ и прочее названия одного и того же) можно почитать здесь.
    Вы не можете знать, какой битрейт нужен каждому отдельному кадру видео, поэтому ваши попытки указать битрейт вручную практически обречены на провал:
    1) Если указанный вами битрейт ниже реально необходимого, вы получите ухудшение качества картинки и артефакты сжатия.
    2) Если указанный вами битрейт выше реально необходимого, то качество видео останется неизменным, но файл будет "весить" больше, чем мог бы.
    Более того, вы указываете битрейт на все видео, в то время как переменный битрейт может быть больше в начале файла (например, где много движения, и требуется больше битрейт), а в конце файла могут быть длинные статичные планы - там битрейт нужен сильно меньше.

    Таким образом, поскольку вы используете VP9 (WEBM), вам следует использовать CRF (Constant Quality):
    To trigger this mode, you must use a combination of -crf and -b:v 0. Note that -b:v MUST be 0. Setting it to anything higher or omitting it entirely will instead invoke the Constrained Quality mode.

    ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 output.webm

    The CRF value can be from 0–63. Lower values mean better quality. Recommended values range from 15–35, with 31 being recommended for 1080p HD video.

    Поэтому все -b:v без CRF сразу выкидывайте.

    Поскольку в задаче не было указано, какой вам нужен размер файла, это самый адекватный подход. Если же вы хотите сжать файл и готовы смириться с потерями качества, нужно использовать Constrained Quality - работает примерно так же, но дополнительно ограничен сверху указанным вами битрейтом:
    ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 2000k output.webm

    The quality is determined by the -crf, and the bitrate limit by the -b:v where the bitrate MUST be non-zero.

    У вас, кроме того, достаточно нескромный для VP9 CRF - 20 - это для 4К без видимых потерь качества. Уверены, что вам нужно такое? Посмотрите гайд от гугла по VP9 - для 1080P они предлагают устанавливать CRF в 31.
    Второй файл с CRF 30 без ограничения битрейтом почти не увеличился. Что по качеству? Просело?

    Я не знаю, какой именно кодек используется в вашем MP4 исходнике, но если это HEVC\H.265, то там можно наколдовать более эффективное и качественное сжатие, особенно если есть много лишнего времени на медленные пресеты или ручной их тюнинг. Такой файл после конвертации в VP9 раздует наверняка.
    Если исходник H264, то он практически всегда должен сжимать хуже VP9, и значит проблема в ваших настройках.

    В общем и целом, при прочих равных, файлы с минимальными изменениями в кадре сжимаются лучше, чем экшн-сцены. То есть если у вас 20 минут абстрактного видео, 2\3 которого - статичное изображение, он будет легче, чем 5 минут абстрактной экшн-сцены.
    Опишите или покажите оба видео, и тогда картина наверняка прояснится.
    Ответ написан
    7 комментариев
  • [AJAX / JQUERY] Uncaught TypeError: Illegal invocation?

    @Insayt
    Укажите дополнительные параметры в $.ajaxSetup

    var $data = new FormData();
    $.ajaxSetup({
                url: "/dummy_url",
                type: "POST",
                data: $data,
                processData: false,
                contentType: false,
                dataType: "json",
    });
    $.getScript('/url');


    processData - отвечает за то, что бы jQuery не пытался превратить объект который вы кидаете внутрь запроса в соответствии с Content-type: 'application/x-www-form-urlencoded'.

    contentType - это будет ли устанавливать jQuery заголовок Content-type. (мб вам и не понадобится)
    Ответ написан
    1 комментарий
  • Можно ли уменьшить количество запросов к базе средствами ORM?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    Можно. Для внешних ключей есть select_related, а для иерархий есть mptt.
    Ответ написан
    3 комментария
  • Как исправить проблему при попытки отправить push?

    rapkin
    @rapkin
    i ♥ gulp coffee
    откройте терминал и введите git push -f origin master
    Ответ написан
    3 комментария
  • Как зафиксировать иконку на последнем слайде?

    LenovoId
    @LenovoId
    I want, women not to get sick
    По идее всё должно считаться автоматически
    Но примерно если без расчётов с тремя слайдами и с подобной кнопкой то вот так
    Ответ написан
    1 комментарий
  • Что если к планшету подключать зарядное на 2,1 ампера?

    syler
    @syler
    Инженер по КИП и АСУ ТП
    Ничего не будет. Подключайте хоть на 100 А.
    Мощность, написанная на зарядном - это его максимальная мощность, по сути пропускная способность.
    Планшет при подключении "возьмет" ровно столько, сколько ему нужно (то есть 2 А).
    Ответ написан
    Комментировать
  • Как на JS/jQuery реализовать слайдер с тач-пролистыванием?

    cashalot
    @cashalot
    Если я вам помог - пометьте мой ответ как решение
    Это называется свайп. Гуглите и скачивайте плагин swipe.js. А работает он так:
    $("#block").on("swipeleft", function(){
    alert("left");
    }).on("swiperight", function(){
    alert("right");
    });
    Ответ написан
    Комментировать
  • Django session: Object of type is not JSON serializable?

    @redskye798
    Комментатор выше прав в том, что в сессию нельзя передавать объекты ORM. Однако автор и не пытается (осознанно) передать в сессию объект. Он думает, что в методе __iter__ добавляет объект product к копии self.favorites, а затем отдаёт в yield, не меняя исходный self.favorites. Увы, исходный self.favorites всё же меняется, и в сессию пытается пролезть объект ORM. Для решения проблемы нужно изменить способ копирования объекта self.favorites.

    Импортируем модуль copy и заменяем favorites = self.favorites.copy() на favorites = copy.deep_copy(self.favorites)
    Должно сработать.
    Ответ написан
    Комментировать
  • Как в django вывести в шаблон count всех объектов подподкатегории?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    Прежде всего, если используете иерархические структуры данных, то используйте их с django-mptt. Во-первых, это позволит работать с любым уровнем вложенности, в том числе неопределённым на этапе разработки и переменным в разных ветках. Во-вторых, это облегчит вам работу, предоставив простые и эффективные методы манипуляции ветками. Наконец, это позволит получать данные из БД наиболее быстрым и эффективным способом, с минимальной затратой ресурсов.

    Конкретно по вашей задаче решением в лоб было бы определить в модели свойство, возвращающее количество объявлений в дочерних категориях:
    class Category(models.Model):
        parent = TreeForeignKey('self', verbose_name=u'Родитель', null=True, blank=True, related_name='children')
        title = models.CharField(u'Название', max_length=100)
    
        @property
        def items_count(self):
            # получаем список идентификторов всех низлежащих категорий, включая интересующую нас
            ids = self.get_descendants(include_self=True).values_list('id')
            # возвращаем количество товаров, имеющих родителем категорию с идентификатором входящим
            # в список полученный строкой выше
            return Product.objects.filter(parent_id__in=ids).count()

    и потом вывести их в шаблоне как-то так
    <ul class="root">
        {% recursetree nodes %}
            <li>
                {{ node.title }}<span>{{ note.items_count }}</span>
                {% if not node.is_leaf_node %}
                    <ul class="children">
                        {{ children }}
                    </ul>
                {% endif %}
            </li>
        {% endrecursetree %}
    </ul>

    Но беда в том, что это квадратичный алгоритм, чем больше будет категорий отображаться на странице, тем больше запросов будет к базе при открытии этой страницы. Я так и не нашёл в Django лучшего решения для этого, чем делать сырой SQL запрос к базе:
    SELECT name, cp.p_count FROM catalog_category AS cc
    INNER JOIN LATERAL (
      SELECT cc.id AS id, SUM(products) AS p_count FROM (
        SELECT cc.id AS parent_id, category_id, COUNT(id) AS products
        FROM catalog_product
        WHERE category_id IN (
          SELECT id FROM catalog_category
          WHERE lft <= cc.rght AND lft >= cc.lft AND tree_id = cc.tree_id)
          GROUP BY category_id
        ) AS sub_cс
      GROUP BY parent_id
    ) AS cp
    USING(id) ORDER BY name;
    Ответ написан
    5 комментариев
  • Post_save: как получить FileField url?

    tumbler
    @tumbler Куратор тега Django
    бекенд-разработчик на python
    Странно конечно, но почему бы не привести байты к строке просто?
    Ответ написан
    1 комментарий
  • SEO в 2019 это карго-культ? Или, всё-таки, стоит в своей компании держать опытного SEO-шника?

    zo0m
    @zo0m
    full stack developer
    Есть канал в телеге от продуктолога: https://t.me/betternotworse
    там был пост про SEO:
    5d4e53d8e28f0151709122.png
    Ответ написан
    Комментировать