• SPA и REST API - как грамотно построить аутентификацию?

    liveunit
    @liveunit
    Думаю jwt аутентефикации хватит с головой.
    Вот тут написано хорошо обо всех токенах и как они работают.
    https://auth0.com/blog/refresh-tokens-what-are-the...
    Ответ написан
    2 комментария
  • Какая есть хорошая книга по истории искусств?

    korshenyk
    @korshenyk
    adobe ps, il, in, xd, html, css, js
    Здравствуйте!

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

    Мысль о том, что дизайнер обязан понимать картины Анатолия Зверева или Кокошки, высосана из пальца студентами художественных вузов, которых еженедельно пичкали новыми "измами". Я сам из таких. Бесспорно нужно знать историю дизайна, то есть историю искусств с конца 19 века, когда появились авангардисты и модернисты. Нужно понимать как работает Золотое Сечение, как работают Числа Фибоначчи, понимать теорию цвета (Иттен), основы типографики (Джеймс Крейг). Владеть инструментами, которыми вы сможете свои идеи воплотить. Зачем вам знать, что такое фаюмские портреты — я не понимаю.
    Я не отрицаю того, что люди должны быть эрудированы разносторонне, но говорить, что знание истории искусства для дизайнера — аксиома. Этого я не понимаю. Дизайнер — это утилитарная профессия, которая решает определённые задачи. Рембрандт тоже решал задачи, поставленные заказчиком ("покажи, что ночной дозор - крутые перцы"), но Рембрандт это делал, не ориентируясь на покупательную способность аудитории, на контраст, на контекст, на концепт. Заказчик платил за то, чтобы это сделал Рембрандт так, как это делает Рембрандт.

    В общем, вот "лёгкие" книги по истории искусствa:
    1. История искусствa Гомбрих
    2. Введение в историческое изучение искусства Виппер
    3. МХК. Учебник для 10 класса. Емохонова.

    4. Пойти в библиотеку, попросить у тамошних служащих, дабы те помогли подобрать подходящую книгу для введения вас в мир искусства.
    Ответ написан
    1 комментарий
  • Как управлять docker'ом?

    amelihovv
    @amelihovv
    Фулстек веб разработчик
    Чтобы поставить доп расширения какие-то или внести любые изменения в образ контейнера, нужно создать свой кастомный Dockerfile. Например, для php это будет выглядеть следующим образом:
    # php/Dockerfile
    
    FROM php:7-fpm:latest
    
    MAINTAINER Vasya Pupkin
    
    # Ставим, например, composer.
    
    RUN php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer


    Затем обновляем docker-compose.yml. Указываем, что будем использовать свой Dockerfile и указываем имя нового образа.
    php:
            build:
    	    context: ./php
    	    dockerfile: Dockerfile
            image: my-php
            volumes:
                - ./www:/www
                - ./php/log.conf:/usr/local/etc/php-fpm.d/zz-log.conf
            networks:
                - code-network


    Чтоб теперь можно поиграться с композером, можно сделать следующие вещи:

    1. Зайти в контейнер по ssh и запускать композер оттуда

    docker-compose exec my-php bash
    composer --version


    2. Запустить композер с хостовой машины

    docker-compose exec my-php composer --version
    или
    docker-compose run --rm  my-php  composer --version


    Чтоб чуть упростить набор команд, можно создать скриптик на bash (установи себе git bash на windows, из него можно будет выполнять его).

    #!/usr/bin/env bash
    
    COMPOSE="docker-compose"
    
    if [ $# -gt 0 ]; then
        if [ "$1" == "composer" ]; then
            shift 1
            $COMPOSE run --rm \
                -w /www \
                my-php \
                composer "$@"
    
        # If "test" is used, run unit tests,
        # pass-thru any extra arguments to php-unit
        elif [ "$1" == "test" ]; then
            shift 1
            $COMPOSE run --rm \
                -w /www \
                my-php \
                ./vendor/bin/phpunit "$@"
    
        # If "npm" is used, run npm
        # from our node container
        elif [ "$1" == "npm" ]; then
            shift 1
            $COMPOSE run --rm $TTY \
                -w /var/www/html \
                node \
                npm "$@"
        else
            $COMPOSE "$@"
        fi
    else
        $COMPOSE ps
    fi


    Ну и с его помощью можно делать следующее

    ./dev.sh # docker-compose ps
    ./dev.sh logs my-php # docker-compose logs my-php
    ./dev.sh composer --version # выполнение любой composer команды
    ./dev.sh npm --version # выполнение любой npm команды
    ./dev.sh test --filter some_test_method # запуск phpunit тестов


    P. S. У меня тоже, когда-то, докер сложновато шел. Это нормально.
    Ответ написан
    2 комментария
  • Не всегда же называть методы глаголами?

    GavriKos
    @GavriKos
    Называйте их SetDate и GetDate в зависимости от того, что они делают.
    Ответ написан
    Комментировать
  • Не всегда же называть методы глаголами?

    qonand
    @qonand
    Software Engineer
    судя по всему у Вас методы устанавливают значения соответствующих свойств.
    Для таких методов принято формировать названия с префиксом set, например: setEvent (установить событие), setDate(установить дату)

    Что касается приведенного фрагмента: это базовый класс Yii фреймворка, а сам по себе код этого фреймворка желает лучшего, с точки зрения соответствия различным практикам программирования. Давайте забудем что это за фреймворк, забудем все что описано в документации по нему, и посмотрим на этот код просто с точки зрения ООП, глазами человека не привязанного к какому-то конкретному инструменту. Например, возьмем метод alias(). Что мы можем сказать о этом методе? Мы можем сказать что в этом методе что-то делается с псевдонимом. Но что конкретно делает этот метод? за что он отвечает? Исходя из его названия - мы ничего о этом сказать не можем, т.к. такое название неочевидно.
    Ответ написан
    4 комментария
  • Что нужно возвращать: null или false?

    qonand
    @qonand
    Software Engineer
    в подобных ситуация стоит возвращать null или Null-object в зависимости от того как реагирует Ваш код на ситуацию когда ничего не найдено. Бросать исключение в таких ситуациях - не особо уместно, все таки "не найдено" это не исключительная ситуация а вполне себе обычная... возвращать false - тоже как-то не камельфо (если есть false должен быть и true)
    Ответ написан
    Комментировать
  • Генерация сущностей из готовой базы данных symfony 4?

    BoShurik
    @BoShurik Куратор тега Symfony
    Symfony developer
    Я вас все-таки пошлю сюда
    The feature explained in this article doesn't work in modern Symfony applications that have no bundles. The workaround is to temporarily create a bundle. See doctrine/doctrine#729 for details.

    https://github.com/doctrine/DoctrineBundle/issues/...
    php bin/console doctrine:mapping:convert --from-database annotation ./src/Entity
    Ответ написан
  • Какие есть сервисы по изучению PHP?

    @kaktys123
    HTML, CSS, JS
    на торренте найди курсы учебного центра специалист там много по каким сферам есть и по php есть они старые но для начала нормально. их посмотри. потом по документации остальное сам изучишь что не будет хватать тебе ну и то что есть в новых версиях. Ну и все дальше практиковаться только. Больше бесплатных вариантов не знаю а платные не факт что лучше будут)
    Ответ написан
    Комментировать
  • Как отключить адаптивность в bootstrap? Или как сделать так чтобы сайт открывался всегда в полной версии?

    @FullStackAlex
    Веб-разработчик, электрик, кочевник
    помимо viewport можно ещё указать минимальную ширину body и html тэгов:
    body, html {
        min-width: 1000px;
    }
    Ответ написан
    Комментировать
  • Реально ли найти гуру frontend-a с которым можно посоветоваться по различным вопросам или это бредовая идея?

    @FullStackAlex
    Веб-разработчик, электрик, кочевник
    Такого рода знакомства в ходе совместного сотрудничества могут возникнуть. Но так, чисто для консультации будет думаю трудно (или даже не реально) найти какого нибудь "гуру" просто "поболтать".

    Я живу в Берлине, тут наверное самая динамичная Web-Dev-сцена во всей Европе, но и мне в принципе не с кем со стажем "проконсультироваться". Бывал я тут на многих meetups (meetup.com) на темы Vue.js, Symfony и WordPress и разговаривал с некоторыми профессионалами, но толку от этих разговоров было мало, разве что пожрать бесплатно обычно на берлинских meetups можно очень хорошо, так как часто их финансируют фирмы которые ищут профессионалов, но даже и это мне как вегану-сыроеду не интересно.

    Так что я просту учусь в одиночку но с помощью хороших книг и туториалов (udemy.com, skillshare.com, lynda.com) и работаю спокойно. До сих пор мой концепт совсем не плохо работал.
    Ответ написан
    Комментировать
  • Где найти примеры исходного кода HTML5 CSS3 сеньерского уровня?

    @FullStackAlex
    Веб-разработчик, электрик, кочевник
    Ответ написан
    Комментировать
  • С какой книги стоит начать изучать html5 и css3?

    @FullStackAlex
    Веб-разработчик, электрик, кочевник
    если знаешь английский то начинай с этих двух:
    John Duckett: HTML + CSS и JavaScript + jQuery

    обе можно легко найти в гугле в формате пдф:
    filetype:pdf john ducket (jQuery javascript OR css html)

    если же с английским не очень:
    Мэтью Мак-Дональд: HTML5 - недостающее руководство

    Дэвид Макфарланд: CSS3 - большая книга
    Ответ написан
    Комментировать
  • Пример хорошего ТЗ/гайдлайна для вёрстки?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Основные требования: здесь
    Примеры стайл-гайдов: здесь

    1. Требования к вёрстке: здесь, здесь, здесь, здесь
    2. Как проверять качество вёрстки: здесь.
    3. Как определять стоимость (трудозатраты) вёрстки одной унифицированной страницы: здесь.
    4. Требования к дизайнеру: здесь и здесь.
    5. Пример документации (генератор шаблона, Helix3 для CMS Joomla!): здесь
    6. Готовые "скелеты" шаблонов HTML5 для начала вёрстки: простой (с поясняющими комментариями), www.initializr.com (ещё 3 простых) и максимально полный html5boilerplate.com.
    7. Вопросы на вакансию верстальщика (front-end developer): здесь

    Бонус по-теме: Turning Design Mockups Into Code With Deep Learning
    Ответ написан
    3 комментария
  • Что изучать, на что тратить свободное время, чтобы в будущем стать востребованным программистом с нормальным заработком?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Ответ на вопрос будет сильно зависеть от того, в каком направлении вы думаете развиваться.
    Будет ли это сетевое программирование? Тогда это си, в основном.
    Может быть, веб-программирование? Тогда тут могут быть php, javascript, python, ruby.
    Захотите разрабатывать программы на десктоп? Вам нужны c# или java.
    На мобильные платформы? тогда java и objective c (плюс swift).
    Или податься в разработку игр? Тогда либо c++, либо с# (для Юнити - наверное, самой популярной платформе).
    Хотите экзотики? Приглядитесь к функциональным языкам - Erlang и Haskell.
    Разработка железа и драйверов для железа? тогда си (без плюсов) и ассемблер.
    Определитесь, что вы хотите, потому что всё объять не получится. Выберите один (или два) направления и добейтесь хорошего уровня в нём. А потом вам будет уже легче двигаться дальше.

    Мой совет - попробуйте изучать C# или Java (они во многом похожи) для софта, или Javascript и php/python для веб-приложений и сайтов.

    Добавлю, что очень правильный совет дал @tsarevfs - помимо языка программирования, хороший программист должен знать несколько инструментов - и в первую очередь, это система контроля версий, например, git. Плюс юнит-тестирование (хотя это можно начать изучать позже, через годик-два). Плюс - нужно хорошо знать свою IDE, в которой работаете; не вздумайте работать в блокнотиках!

    Ещё помимо практики нужно знать теорию - читайте Макконнелла, Фаулера, Мартина, Бека.
    Подпишитесь на хабре на пару десятков хабов и регулярно читайте всё подряд. Через годик ваш уровень понимания статей сильно вырастет.

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

    UPD. Важное дополнение из обсуждения в комментариях (спасибо @Argentum88 @Deerenaros )
    Чтобы стать профессионалом и "востребованным программистом с нормальным заработком", нужно очень хорошо понимать внутреннее устройство тех систем (платформ, фреймворков), на которых идёт работа.
    Для этого нужно заглядывать вглубь. Изучив различные мейнстрим-инструменты, посмотреть на аналогичные менее популярные системы. Изучать исходный код используемых open-source библиотек. Написать свою подобную систему. Для web - написать свою CMS (хотя бы базовую). Для десктоп-программ - попробовать программировать без навороченных библиотек, которые делают рутинную работу за программиста. Для разработчика игр - сделать простую игру на базовом инструментарии платформы, где всё придётся делать своими руками.
    Всё это даст возможность проникнуться, почему всё делается именно так, даст понимание взаимосвязей разных частей программы.
    А потом, осознав это, выбрать один из уже готовых инструментов, и продолжать писать на нём, уже обладая более глубоким его пониманием.
    Ответ написан
    21 комментарий
  • В двух словах, что такое БЭМ?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    БЭМ - это такая методология вёрстки от Яндекса. Она подразумевает разбиение страниц на отдельные смысловые блоки (комментарий, пост, заголовок, футер, форма, инпут и т.п.). Каждый блок может состоять из других блоков. Основная идея - как можно больше повысить возможность повторного использования уже написанных блоков, для чего используются модификаторы. Плюс, БЭМ подразумевает отказ от каскадных стилей, потому что они препятствуют повторному использованию.
    Например, на странице есть два разных заголовка (например, отдельно в статье, и отдельно во врезке). Как все привыкли делать это? есть код заголовка:
    <h1 class="header">Заголовок</h1>
    И мы ставим эти заголовки в текст статьи и во врезки:
    <article class="article">
        <h1 class="header">Заголовок</h1>
        <p>Текст текст текст</p>
    </article>
    <aside class="incut">
        <h1 class="header">Заголовок</h1>
        <p>Текст текст текст</p>
    </aside>

    Тогда обычно мы используем каскад, чтобы стилизовать заголовок во врезке:
    .header {font-size: 2em; padding-bottom: 1.5em;}
    .incut .header {text-decoration: italic;}

    Всё хорошо, но теперь мы не можем просто перенести эти стили заголовка во врезке в другое место, потому что эти стили привязаны именно ко врезке (классу incut). Плюс, что ещё хуже, если к элементу привязано несколько различных стилей, образующихся подобными каскадными правилами, то перенести такой внешний вид в другое место становится очень трудоёмко. А также, из-за большей специфичности каскадных стилей, их сложнее "перебить" новым стилем.
    БЭМ предлагает отказаться от каскадных стилей и создавать отдельные стили-модификаторы:
    <article class="b-article">
        <h1 class="b-article__header">Заголовок</h1>
        <p>Текст текст текст</p>
    </article>
    <aside class="b-article b-article__incut">
        <h1 class="b-article__header b-article__header_incut">Заголовок</h1>
        <p>Текст текст текст</p>
    </aside>


    .b-article__header {font-size: 2em; padding-bottom: 1.5em;}
    .b-article__header_incut {text-decoration: italic;}


    Чем больше проект, тем выгоднее использование подобной методологии. На маленьких и средних проектах БЭМ может быть избыточен. Хотя вот была статья habrahabr.ru/company/yandex/blog/234905 про использование в маленьких проектах.

    БЭМ может использоваться самостоятельно, вручную создавая все элементы и блоки. Но существует обширный инструментарий для БЭМа, который помогает создавать библиотеку элементов и блоков.

    Ну вот. Получилось не в двух словах, но менее подробно качественно описать БЭМ не получится, имхо.
    Ответ написан
    Комментировать
  • Как заменить switch case паттерном стратегия?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Switch
    public enum DamageType { Melee, Range, Magic }
    public class Monster
    {
        public double Health { get; private set; }
        public double MeleeDamage { get; private set; }
        public double RangeDamage { get; private set; }
        public double MagicDamage { get; private set; }
        public DamageType FavoriteDamageType { get; private set; }
    
        public Monster(double health, double meleeDamage, double rangeDamage, double magicDamage, DamageType favoriteDamageType)
        {
            Health = health;
            MeleeDamage = meleeDamage;
            RangeDamage = rangeDamage;
            MagicDamage = magicDamage;
            FavoriteDamageType = favoriteDamageType;
        }
    
        public void AttackTo(Monster monster, DamageType damageType)
        {
            switch (damageType) // используется switch
            {
                case MonsterType.Melee: monster.Health -= MeleeDamage; break;
                case MonsterType.Range: monster.Health -= RangeDamage; break;
                case MonsterType.Magic: monster.Health -= MagicDamage; break;
            }
        }
    
        public void AttackTo(Monster monster)
        {
            AttackTo(monster, FavoriteDamageType);
        }
    }


    То же самое, но со стратегией
    public class Monster
    {
        public double Health { get; set; }
        public double MeleeDamage { get; private set; }
        public double RangeDamage { get; private set; }
        public double MagicDamage { get; private set; }
        public IDamageStrategy FavoriteDamageStrategy { get; private set; }
    
        public Monster(double health, double meleeDamage, double rangeDamage, double magicDamage, IDamageStrategy favoriteDamageStrategy)
        {
            Health = health;
            MeleeDamage = meleeDamage;
            RangeDamage = rangeDamage;
            MagicDamage = magicDamage;
            FavoriteDamageStrategy = favoriteDamageStrategy;
        }
    
        public void AttackTo(Monster monster, IDamageStrategy damageStrategy)
        {
            damageStrategy.Attack(this, monster); // не используется switch
        }
    
        public void AttackTo(Monster monster)
        {
            AttackTo(monster, FavoriteDamageStrategy);
        }
    }
    
    
    public interface IDamageStrategy
    {
        void Attack(Monster attacker, Monster defender);
    }
    public class MeleeDamageStrategy : IDamageStrategy 
    {
        public void Attack(Monster attacker, Monster defender)
        {
            defender.Health -= attacker.MeleeDamage;
        }
    }
    public class RangeDamageStrategy : IDamageStrategy 
    {
        public void Attack(Monster attacker, Monster defender)
        {
            defender.Health -= attacker.RangeDamage;
        }
    }
    public class MagicDamageStrategy : IDamageStrategy 
    {
        public void Attack(Monster attacker, Monster defender)
        {
            defender.Health -= attacker.MagicDamage;
        }
    }

    Отличие класса Monster только в коде первого метода AttackTo. Ну и свойства FavoriteDamageType или FavoriteDamageStrategy.

    Стратегия может быть полезна, если код атаки, в зависимости от типа, сильно отличается, используя внешние данные (не из класса монстра), например, день или ночь, ясно/дождь и пр. Использование стратегии переносит часть кода из класса монстра (и так сложного класса) в несколько простых классов.
    Ответ написан
    1 комментарий
  • С чего начать создание игры?

    k12th
    @k12th
    console.log(`You're pulling my leg, right?`);
    Пишете питч на одну-полторы страницы:
    • название
    • таглайн геймплея одной строкой (на что похоже и чем отличается в лучшую сторону)
    • синопсис сюжета (можно тоже одной строкой на данном этапе)
    • USP (unique selling point, почему в игру будут играть)
    • платформа/платформы
    • ЦА — люди, которым должна понравится ваша игра (независимо от пола и возраста, если, конечно, речь не о розовых понях для девочек 8 лет)
    • более развернутые абзац или два о игре в целом, планируемые механики (особенно новые и ключевые), на что в игре будет упор
    • референсы (на что похоже визуально и по музыке, с указанием почему нравится и почему нет — чтобы художники и композиторы понимали, какой стиль вы хотите, а остальные понимали атмосферу и настроение)


    Этот питч уже можно показывать людям и подбирать команду/единомышленников.
    Пока этот процесс длится, можно писать "библию мира" — документ с описанием реалий мира и его законов (если, конечно, действие происходит не в настоящем или истории). Из сеттинга вытекают персонажи, из персонажей — конфликт между ними. Главных персонажей тоже надо хорошенько описать — как выглядит, как ходит, тембр голоса и речевые особенности (два последних пункта — если в игре есть диалоги).
    Параллельно пишется дизайн-документ — расширенная версия питча, где подробно расписаны механики, в чем они похожи на существующие в других играх и чем отличаются, как взаимодействуют друг с другом, как ведут к монетизации (если она есть), уровни/локации/миссии.
    С командой и документами можно делать прототипы. Для сюжетно-ориентированных игр можно спрототипировать историю и всякие диалоги в текстовом движке типа Twine. Прототипы механик лучше делать на уже выбранном движке, чтобы сразу было понятно, нет ли каких ограничений и подводных камней с этой стороны. Художники рисуют концепт-арты, композиторы пишут музыку.
    С этого же момента можно начинать строить сообщество — заводить дневничок разработчика в соцсетях и т.д.

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

    Пытаетесь пробиться в стиме среди тысяч других инди-разработчиков:)
    Ответ написан
    5 комментариев
  • Git: объясните «на пальцах» разницу между rebase и cherry-pick?

    @Nkly777
    git chery-pick - ты забираешь комиты из одной ветки в другую, это бывает полезно когда изменения сделаные другим разработчиком в его ветке, прямо сейчас нужны тебе в твоей ветке, и что бы не писать этот код заново, ты забираешь его комит себе в ветку

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

    git merge - обычно используется когда у вас 2 и более master ветки (к примеру master и prototype) в этих ветках очень много комитов (и rebase здесь не подходит) и обчно через пару недель, maintainer репозитория наработки из prototype ветки "сливает" в master ветку по средствам этого самого git merge

    P.S. Что бы легче предствить разницу между git merge и git rebase. Представь что merge как собачка на молнии у одежды - "сшивает" комиты по дате их создания.
    В то время как git rebase как пожарная лестница - при применении твои коммиты крепится на конец родительской ветки

    git merge используйте для мержа фич и фиксов в master ветку (как и делает это Github)
    а git rebase используется для своей ветку в которой вы работаете над фичей что бы забрать последние изменения с master ветку (для этого есть очень удобная команда `git pull --rebase origin master`, аналог 3х команд (`git checkout master; git pull origin master; git checkout mybrach; git rebase master`)
    Ответ написан
    2 комментария