• Какие технологии необходимо знать для создания красивых анимированных веб-сайтов?

    MrDecoy
    @MrDecoy Куратор тега CSS
    Верставший фронтендер
    Тут не будет идеального ответа, так как всё зависит от конкретного дизайна и его идеи.

    Но если так издалека начать накидывать, то конечно же:
    CSS

    • transforms
    • perspective
    • animations
    • производительность (например, такие свойства как: will-change, contain)
    • filters
    • clip-path
    • positions
    • masks


    JS

    • requestAnimationFrame
    • Управление скроллом
    • дебаунс\тротлинг
    • canvas
    • WebGL
    • three.js
    • EventLoop - таски, в том числе рендер таски
    • Управление видео и аудио


    SVG

    • фильтры
    • блюры
    • анимации
    • паттерны
    • маски


    Общее

    • Производительность - как организовать слои и анимацию так, чтобы выдавать как можно больше fps и как можно меньше перерисовок.
    • Безопасные для анимации свойства (то есть знать что такое repaint и reflow)

    Ответ написан
    1 комментарий
  • Правильно ли я понял принцип инверсии зависимостей?

    @Akela_wolf
    Extreme Programmer
    Главная идея принципа инверсии зависимостей "детали зависят от абстракций, но не абстракции от деталей".
    В приведенном вами примере класс Main зависит от всего: от интерфейса INumberOperation и от обоих классов NumberOperation1, NumberOperation2. То есть тут принцип инверсии зависимостей вообще не работает. Никак.

    Проявляется же он в следующем примере. Пусть у меня есть некая абстрактная логика "прочитай число, выполни над ним операцию, запиши результат". Эта абстрактная логика (потому она и абстрактная) ничего не должна знать ни откуда она читает число, ни какую операцию над ним выполняет, ни куда и как записывает результат. Таким образом, у нас есть модуль, состоящий из
    interface NumberInput {
      int read();
    }
    interface NumberProcessor {
      int process(int a);
    }
    interface NumberOutput {
      void write(int a);
    }
    class Processor {
      private final NumberInput input;  
      private final NumberProcessor processor;
      private final NumberOutput output;
    
      public Processor(NumberInput input, NumberProcessor processor, NumberOutput output) {
        this.input = input;
        this.processor = processor;
        this.output = output;
      }
    
      void process() {
        output.write(processor.process(input.read()));
      }
    }

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

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

    Этот принцип очень хорошо объяснен в книге Р.Мартина "Чистая архитектура", по крайней мере у меня все встало на свои места именно после прочтения этой книги.
    Ответ написан
    1 комментарий
  • Как рулить docker-compose в проде?

    DoctorStein
    @DoctorStein
    QNX, Linux, С++, С#, mono
    docker-compose не очень, сейчас в моде kubernetes. Но если очень хочется, то можно:
    1. Редактируем yaml и Dockerfile если надо. docker-compose build, docker-compose down, docker-compose up -d. Если изменения yaml большие, например меняется состав сервисов, то стоит down сначала, потом редактирование.
    2,3. По возможности локально image не собираются. Есть отдельный процесс разработки, image выкладываются в частный registry, откуда и берутся композом.
    4. Образы строятся на том, на чём удобно разработчику. Ни разу не было задачи заменить типа описанной. Но бывает наоборот - новая ОС, на ней запускаются старые проверенные докеры.
    5. docker-compse stop servicename
    Ответ написан
    4 комментария
  • Как telegra.ph понимает, что я - это я?

    hottabxp
    @hottabxp
    Сначала мы жили бедно, а потом нас обокрали..
    Как тогда Паша понимает, что я - это я?
    Устанавливает тебе печеньки, потом читает их.

    Проблема заключается в том, что ни в локальном хранилище, ни в сессиях, ни в куках нет вообще никаких данных.
    Не совсем верно. Во вкладке "Приложение" их нет, а вот во вкладке "Сеть" по клике на запрос - есть.61fa945a35416058169057.png
    Эти печеньки можно установить в другой профиль/браузер с помощью любого расширения для работы с cookies. Возьмем к примеру расширение Cookie Editor и создадим новую печеньку со следующими параметрами:61fa952a7dcd3486538452.png
    И вуаля, у нас в другом браузере появится кнопочка "Edit'.
    Ответ написан
    Комментировать
  • Как правильно поставить тип параметру?

    miraage
    @miraage
    Старый прогер
    interface TodoItem {
        id: number
        subtitle: string
        important: boolean
        done: boolean
    }
    
    const generalToggle = (arr: TodoItem[], id: number, propertyName: keyof TodoItem) => {
            const idx = arr.findIndex((item) => item.id === id);
            const oldItem = arr[idx];
            const value = !oldItem[propertyName];
    
            const item = {...arr[idx], [propertyName]: value};
            return [
                ...arr.slice(0, idx),
                item,
                ...arr.slice(idx + 1)
            ];
        };


    А еще лучше, храните TODO объектом по ключам (для мутаций) и отдельно список IDs (для рендера списка), чтобы O(n) не гонять на каждое изменение.
    Ответ написан
    9 комментариев
  • На чём нынче модно писать кросс-платформенный GUI для десктопов?

    https://www.mono-project.com/docs/gui/
    avaloniaui.net
    На моду не обращать внимания.
    Ответ написан
    Комментировать
  • Что пишут на C#?

    MalkovVladimir73
    @MalkovVladimir73
    Fullstack (node + vue.js)
    Декстопные программы для винды. Энтерпрайз бэкенд (sharepoint, asp.net MVC). Бэкенд мигрирует на кросплатформенный .net core. Игры на unity. А вообще, по большому счету, на c# можно что угодно писать.
    Ответ написан
    1 комментарий
  • Игры написанные на С#, как их импортировали на андроид и ios, как это проходит?

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

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

    Unity.

    92e98462045849939fdf92df2bc1c18a.png

    Самый популярный на сегодняшний день. Компонентный подход, огромное кол-во плагинов, что сокращает время на разработку. Можно разрабатывать как на C#, так и на JavaScript. Активная поддержка Microsoft, интеграция в среду разработки Visual Studio. Есть и минус, к нему придётся привыкнуть, он платный, как и нормальные плагины.

    WaveEngine.

    084eb17385aa415ba49f2672b04c0e6b.png

    Абсолютно бесплатный движок. Проект существует с 2013 года, активно развивается и поддерживается, кросплатформенный, как раз за счёт Xamarin. Есть возможность разработки не только на Windows, но также на Linux и MacOS. C# родной язык, будешь как рыба в воде, компонентная модель и поддержка со стороны Microsoft, периодически проводят совместные конкурсы с денежными призами. Есть и минусы не такой популярный, как тот же Unity, часть функционала придётся писать самому, небольшое, но быстро развивающееся комьюнити, а это поддержка и быстрое решение возникающих вопросов.

    GoDot (произносится, как ГоуДо).

    d9f3bfc5bfd447fb8fafaf10c59c49a6.png

    Уникальный с открытым исходным кодом, бесплатный и быстрый, мультиплатформенная разработка (Godot works on Windows, OS X, Linux, FreeBSD, OpenBSD and Haiku. Editor runs in 32-bit and 64-bit, in all platforms.), кроссплатформенный, написан на С++. Можно писать как на С++, так и на собственном скриптовом языке GDScript, очень простой, понятный, легко освоить за день. Огромное комьюнити, общирная документация и примеры, наличие модели плагинов, в последнее время активно развивается.

    Из последних новостей, разработчики анонсировали официальную поддержку C# на платформе Mono. Из статьи понятно, что движку нужно идти дальше, а популярный язык программирования привлечёт огромную аудиторию + поддержку Microsoft.

    --
    Уверен, в сети сможешь отыскать ещё множество движков, я лишь указал на те, что привлекли моё внимание.
    Ответ написан
    Комментировать
  • Как сделать редирект с задержкой в Laravel?

    Sanasol
    @Sanasol Куратор тега Laravel
    нельзя просто так взять и загуглить ошибку
    Либо делаете редирект 301, либо показываете страницу на которй meta/js редирект, и это уже не будет 301 редирект.
    Третьего не дано.


    view('production.pages.home.test');  
    sleep(3); 
    Redirect::to('https://final.com', 301);


    26326068d049fcc7301199f97240.png
    Ответ написан
    Комментировать
  • Как добавить несколько почтовых адресов в Mail на Mac?

    0xcffaedfe
    @0xcffaedfe
    Developer & Reverser
    Настройки:
    nPazCjI.png
    или прям тут:
    YlXQvuF.png

    Странный вопрос.
    Ответ написан
    Комментировать
  • Как вытянуть все товары со всех разделов по определенному свойству в bitrix?

    Считаем что свойство зовут "PROPERTY_BRAND"
    $brands = [];
    $arF = ["IBLOCK_ID" => $IBLOCK_ID,"!PROPERTY_BRAND" => false];
    $res = CIBlockElement::GetList(["PROPERTY_BRAND"=>"ASC"],$arF,["PROPERTY_BRAND"],false);
    while($arRes = $res->Fetch()){
      $brands[$arRes["PROPERTY_BRAND_VALUE"]] = $arRes["CNT"];
    }

    на выходе получится массив вида ["Asus" => 22, "Bosch" => 10, ...]

    Если у вас свойство "PROPERTY_BRAND" список тогда необходимо сделать еще запрос:

    $brandsTMP = [];
    $res = CIBlockPropertyEnum::GetList([], ["IBLOCK_ID"=>$IBLOCK_ID, "ID"=>array_keys[$brands]]);
    while($arBrand = $res->fetch()){
      $brandsTMP[$arBrand["ID"]] = [
        "ID" => $arBrand["ID"],
        "VALUE" => $arBrand["VALUE"],
        "CNT" => $brands[$arBrand["ID"]]
      ]
    }
    $brands = $brandsTMP;
    Ответ написан
    Комментировать
  • Шаблоны приложений для андроид, есть ли биржи как теплейтмонстр?

    @onepavel
    Консультация и разработка мобильных приложений
    Ответ написан
    Комментировать
  • Простая JavaScript игра. Как обезопасить ajax-запросы от фальсификации?

    alsopub
    @alsopub
    Если кто-то задастся целью - отправит поддельный запрос, ведь весь код доступен на клиенте.
    Варианты:
    1) Обфускация кода, где будет вычисляться что-то типа md5(время + чего-нибудь) и сверяться на сервере. Просто повышается сложность поиска алгоритма.
    2) Запись и отправка на сервер игрового процесса, проверка на сервере процесса игры (зависит от игры).
    Ответ написан
    3 комментария
  • Как сделать простенький текстовой ротатор?

    @nikfakel
    Веб-разработчик
    Готовое решение в любом случае проще Slick Slider
    Ответ написан
    2 комментария
  • Как добавить класс только первому тегу в списке, генерируемом с помощью jade?

    each val, index in ["Journal", "About", "Work", "Contact"]
      - var class = 'main-nav__item';
      - class += index === 0 ? ' special' : ''
      a(href="/", class="#{class}")= val
    Ответ написан
    4 комментария
  • JS-скрипт. Утечка памяти. Как исправить?

    byte916
    @byte916
    Скорее всего утечка памяти при создании таймера.
    Дело в том, что функция, созданная в таймере, не удаляется пока она не завершена. У вас она рекурсивно создаёт таймер для себя при каждом тике, и вследствие замыкания тянет за собой уже устаревшие и не нужные данные. Скорее всего, нужно копать в эту сторону, например использовать setInterval
    Ответ написан
    1 комментарий
  • Есть ли система, которая помогает выявить источник взлома (помимо стандартных логов)?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    сверено с исходниками - все чисто

    И в БД тоже? Я очень давно последний раз трогал MODx и на сколько помню там было в моде часть исходников хранить в БД.
    Надеюсь вы проверяли исходники не вручную? (в смысле через diff в вашей VCS + в БД)

    Есть мысли вынести сайты на уровень выше корня, оставив только точку входа

    Это первое, что нужно делать))

    Как вообще проводится поиск эксплойтов на сайте, если идей никаких нет?

    0 - Если у вас в публичном каталоге не одна точка входа, а весь проект - вы уже себе в ногу выстрелили
    1 - Ищутся CVE в багтрекере CMS
    2 - Проверяются плагины, установленные в системе, они тоже могут содержать уязвимости
    3 - Проверяется возможность загрузить и выполнить файл. Например на uploads (или как там каталог называется) права на запуск должны со всей силы отсутствовать
    4 - Проверяются открытые порты сервера (если наружу торчит mysql, redis, memcached, ... - тогда сами себе злобный буратино)
    5 - Ищутся все возможные точки с eval/include/require/include_once/require_once/exec/shell_exec/... для стороннего кода это потенциальная точка выполнения
    6 - Ищутся возможные sql инъекции по коду cms/плагинов
    7 - Ищутся всевозможные phpmyadmin и тому подобные сервисы, торчащие наружу
    8 - Если в коде активно юзаются глобальные переменные - это потенциальная дыра в безопасности
    9 - Если аргументы методов не проверяются - это тоже потенциальная дыра в безопасности
    10 - Вам стоит убедиться и в том, что отсутствует утечка изнутри. На одном проекте случайно нашел залитый бывшими сотрудниками phpspy
    Ответ написан
    3 комментария
  • Как отправить форму через сабмит, но перед сабмитом отправить пост запрос?

    kosolapus
    @kosolapus
    Если помогло - отмечайте решением
    В подходе ошибка)
    2 пути, быстрый и верный. Верный - чистить корзину при получении callback от платежного сервиса с сообщением об успешном платеже (ну вот нет у меня денег на вебмани, а я 276 позиций каталога набивал полтора часа. Да я скорее клаву об стол разобью, чем повторю процедуру при ошибке на стадии оплаты)
    Быстрый - кидать пост по клику на кнопку, которая должна творить сабмит. Тут как раз надо будет preventDefault - чтоб не отправилось, $.post() - чтоб ушло и $("form").submit(); - ручками отправить форму
    Ответ написан
    4 комментария
  • Как не дать одному человеку одновременно зайти с разных учетных записей?

    gbg
    @gbg
    Любые ответы на любые вопросы
    При такой постановке - никак. Зловред просто возьмет у товарища мобильник и сделает свое дело.
    Ответ написан
    9 комментариев