Задать вопрос
  • Контроль версий photoshop, есть ли?

    A1ejandro
    @A1ejandro
    youtube блогер, ИТ-специалист
    Короче всё проще. Ставите Dropbox, и храните psd в каталоге dropbox'а. Оно всё синхронизирует с хранилищем, в хранилище есть контроль версий....
    Ответ написан
    Комментировать
  • Как правильно написать авторизацию/аутентификацию?

    dasha_programmist
    @dasha_programmist
    ex Software Engineer at Reddit TS/React/GraphQL/Go
    Есть два варианта хранения данных об авторизованном пользователе:
    1) В куки (так по умолчанию используется в асп.нет): необходимые данные (claims) шифруются machineKey и отдаются пользователю в http-only куках, таким образом при каждом запросе на сервер они присылаются, расшифровываются и далее можно проверить в необходимых местах.
    плюсы: полностью stateless, нет надобности обращаться к БД
    минусы: при необходимости "выбить" сессию со стороны сервера нужно поднимать более сложную логику и хранить флаги в промежуточном хранилище (проверять что если для такого-то пользователя требуется завершить, то такие действия, иначе другие);
    2) Ключ сессии: после успешной аутентификации авторизуем пользователя и claims храним на сервере в быстрой памяти или БД (key-value), где ключ - ключ сессии, значение - любые данные.
    плюсы: есть полный контроль состоянием авторизации (как и возможность завершить сессию со стороны сервера, так и сменить пользователю роль(или другие параметры) "на лету")
    минусы: организация доп. прослойки - кэша или хранение в БД (медленно), при перезапуске/падении сервиса сессии клиентам потребуется перелогиниться.

    1
    1.1 В куки писать или ключ сессии или шифрованные данные о пользователе, сессия - абстрактное понятие (это пара: ключ и данные), ключ должен быть защищенным, т.е. трудным к копированию (хотя бы зрительно трудно запомнить), уникальным (чтобы не возникло коллизий: двум разным пользователям выдался один и тот же ключ, т.е. это не должна быть хэш-функция от логина-пароля или IP или чего-то неуникального).
    1.2 В асп.нет существуют атрибуты авторизации (в которых можно расставлять проверки на требование таковой, роль, конкретный пользователь), в общем смысле логика такова: поступил запрос на сервер, далее нужно посмотреть к какому ресурсу идёт обращение (защищенному или свободному), если ресурс защищен, то проверить куки (ключ сессии или шифрованные данные), расшифровать/получить данные о сессии из кэша и предпринять решение: пускаем или не пускаем (отдаём 401/403 или отдаем 200/404/...).
    1.3 Завести на сервере (в кэше или БД) словарь , при алгоритме проверки сессии добавить условие проверки на наличие записи в словаре.
    1.4 С нескольких - словаря не нужно.

    2
    2.1 Даже если пользователь входит через ВК всё равно нужно отдавать свои ключи сессий/шифрованные данные, а вот внутри данных уже хранить access_token от вк-шной сессии, так очень маленькая вероятность, что токен ВК утечет, а если утек ключ сессии, то действия будут ограничены только функционалом сайта.
    2.2 После расшифровки куки или данных по ключу сессии делать доп запрос на сервер ВК с токеном, который сохранился при аутентификации (access_token), запрос простой, например получить имя пользователя, если ВК выдал что токен просрочен или ошибку, то сессию закрывать или куки с данными обнулять.
    Ответ написан
    3 комментария
  • Как заменить этот кусок PHP-кода в Ruby?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    https://repl.it/BQA4/1
    require 'digest/sha2' 
    
    @arHash = [ 
        'm_shop', 
        'm_orderid', 
        'm_amount', 
        'm_curr', 
        'm_desc', 
        'm_key' 
    ];
    
    puts Digest::SHA256.hexdigest(@arHash.join(':')).upcase

    Я нагуглил ответ на ваш вопрос за 5 минут, имея практически нулевые знания Ruby.
    Попробуйте в следующий раз не лениться и подумать самостоятельно. Вот вам полезный справочник - www.phptoruby.com
    Ответ написан
    1 комментарий
  • Можно ли считать, что Bootstrap теряет актуальность?

    allard
    @allard
    Серийный программист
    Less/Sass в помощь господа. Как верстал большие проекты так и буду верстать на bootstrap.

    Что касается мненией "не актуален" и "bootstrap для тех кто не умеет верстать": Если вы не понимаете сути css-фреймворка как такового, то зачем писать такие мнения. И я не только про bootstrap, а про все css-фреймворки.
    Когда попробуете сам фреймворк в действии, а не просто скачаете минифицированный скомпилированный css файлик, тогда поймете всю прелесть и не сможете верстать по другому.
    Less/Sass это не просто css и за пару минут вы не сможете понять все прелести. Попробуйте хотя бы Less с bootstrap (он попроще Sass, хотя по моему мнению Sass интереснее и продуманнее), отключите не нужное вам, пользуйтесь "переменными", пользуйтесь миксинами, увидите что это ускорит скорость разработки в разы.
    Удачи всем.
    Ответ написан
    Комментировать
  • Учебный материал по разработке игровой логики?

    @DrSpritz
    Почитайте Архитектура сервера онлайн-игры на примере Skyforge. Это конечно, не то о чем Вы спрашивали (это не учебное пособие), но думаю Вам будет интересно почитать. Лично я для себя нашел этот материал интересным.
    Ответ написан
    Комментировать
  • Как правильно сохранять отношения в Yii2?

    copist
    @copist
    Empower people to give
    Прямых методов нет, то ты можешь реализовать их таким образом самостоятельно

    class Comment extends CActiveRecord
    {
        public function setUser(\User $user = null)
        {
            if (is_null($user))
            {
                $this->user_id = null;
            } else
            {
                $this->user_id = $user->id;
            }
        }
    }
    
    $comment = new Comment;
    $comment->user = $user;
    // или
    $comment->setUser($user);


    На самом деле схема значительно более сложная, чем просто написать setter для свойства user.
    Что делать, если поменять свойство user_id через которое вычисляется user - его же вроде опять надо подгрузить из базы?
    Будут ли идентичными сущности $user для двух разных комментариев с одинаковым user_id?
    Что делать, если $user ещё не был сохранён ? Не давать присваивать $comment->setUser($user) или делать автоматическое сохранение цепочкой (сначала $user, затем $comment) ?

    Много много много вопросов.
    В Yii2 такие сложности не реализованы, поскольку универсальное всеохватывающее решение как в Doctrina или PropelORM работают очень медленно и жрут память. Там как раз иногда приходится запрещать навороченную логику.
    Ответ написан
    1 комментарий
  • Почему не любят Ember.JS?

    @EvgeniyKonstantinov
    На мой взгляд по двум из причин: так исторически сложилось или так модно.

    Каким то образом получилось что в рунете более популярны Backbone, Angular, а не Ember.

    Думаю что в своем видении причин я более или менее прав поскольку очень редко кто при выборе фреймворка проводит полноценное сравнительное исследование.

    Обычно на кого больше ссылок выдал Google, того и принимают за идеал - ведь 86% не могут ошибаться.
    Ответ написан
    2 комментария
  • Продвинутая литература по тестированию?

    @matperez
    Как не смешно звучит, сам я эти книжки не читал, но, когда собирал подобную же вашей коллекцию, заметил, что их во многих местах рекомендовали безотносительно языка:
    The-Art-Unit-Testing-examples
    xUnit-Test-Patterns-Refactoring-Code
    ActiveRecord нормально тестируется с помощью частичных моков. Даже запросы нормально тестируются, если их выносить в отдельный класс, а ActiveRecord::find() использовать только как фасад для получения инстанса нужно класса с запросами.
    П.С. Поделитесь потом что нашли и что реально оказалось полезным.
    П.П.С. А вот еще книжка хорошая The Clean Architecture in PHP. Она вроде бы не сложная, но очень хорошо описывает как можно IoC использовать, а это прямой путь к хорошим тестам.
    Ответ написан
    1 комментарий
  • Продвинутая литература по тестированию?

    @SilverSlice
    Real-World Solutions for Developing High-Quality PHP Frameworks and Applications. Один из авторов - создатель PHPUnit. Книга местами устарела, но кое-что, возможно, почерпнёте.
    Ответ написан
    Комментировать
  • Как правильно давать работу дизайнеру?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Вы задавали этот вопрос уже Как правильно покупать web-дизайн? и Вам там много умных людей аргументированно написали почему рисовать страницы поштучно - откровенно хреновая идея.

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

    akarin
    @akarin
    Сидят 3 хиспстера в свитерах и пьют кофе. Менеджер ищет на гитхабе что то похожее на свой будущий проект.
    Ответ написан
    Комментировать
  • Как обустроена работа в веб-студии?

    vvpoloskin
    @vvpoloskin Куратор тега Компьютерные сети
    Инженер связи
    Сколько человек мыслит, например, над концепцией будущего проекта?

    Ни сколько. Менеджер согласовывает с клиентом ТЗ и пилится сайт на основе имеющихся наработок.

    За что отвечают старший дизайнер и арт-директор?

    Таковых нет. Если клиента не устраивает предложенный макет, отдается заявка на фриланс.

    Здесь же был вопрос про типовую веб-студию?
    Ответ написан
    Комментировать
  • Какой должна быть ORM?

    > И меня несколько удивило отсутствие каких-либо наработок в этой области в Rust (хотя бы начальных версий).
    1) язык в релизе несколько месяцев, чего вы хотите-то;
    2) не во всех языках ORM смотрится естественно. В C++ нормальной ORM нет до сих пор, есть некоторые библиотеки на базе Qt, но де-факто стандарта нет просто потому, что в языке недостаточно силен уровень метаданных. Но в этом нет проблемы просто потому, что на плюсах редко пишутся приложения, где нужен такой уровень;
    3) А может повсеместное использование ORM это только удел web?
    Я бы сказал что ORM это удел бизнес-приложений и языков высокого уровня (Java/.NET/Ruby). Другое дело, что веб-приложения в 99% случаев пишут на всяких asp.net и Рубях, а не на плюсах, поэтому и такая корреляция. Внутрикорпоративных десктопных приложений по прежнему достаточно, и как раз там ORM тоже любят.

    > Подскажите, на сколько высокоуровневой должна быть ORM?
    Это вам решать, ORM-ки разные бывают, кто-то где-то используют потолще, кто-то - потоньше. Лично я особого смысла в тонких не вижу для большинства задач, поэтому на мой вкус в ORM обязательно должны быть следующие вещи:
    1) martinfowler.com/eaaCatalog/identityMap.html
    2) martinfowler.com/eaaCatalog/unitOfWork.html
    3) martinfowler.com/eaaCatalog/inheritanceMappers.html

    Вообще, озакомьтесь для начала со всеми Object-Relational паттернами: martinfowler.com/eaaCatalog, а то наверняка напишете парк велосипедов.
    Ответ написан
    2 комментария
  • I18n в Yii2 использование спец ключей вместо фразы на языке оригинала?

    SamDark
    @SamDark
    Yii2 core team
    Использовать ключи — нормальный подход. `sourceLanguage` укажите как `key` и вперёд.
    Ответ написан
    Комментировать
  • Как тестировать методы, создающие объекты других классов?

    @matperez
    Разнесите создание инстанса и его использование.
    class BarFabric
    {
      public function create(array $config = [])
      {
        return new Bar($config);
      }
    }
    class Foo
    {
      protected $barFabric;
      public function __construct(BarFabric $barFabric)
      {
        $this->barFabric = $barFabric;
      }
      public function someMethod()
      {
        $bar = $this->barFabric->create();
        $bar->method1();
        $bar->method2();
        $blabla = $bar->getResult();
        //etc
      }
    }
    
    class FooTest
    {
      public function testSomeMethod()
      {
        $bar = \Mokery::mock(Bar::class);
        // ... описание поведения для мока
        $factory = \Mokery::mock(BarFactory::class);
        $factory->shouldReceive('create')->andReturn($bar);
        $foo = new Foo($factory);
        $this->assertSomething($foo);
      }
    }


    О том, как быть с ActiveQuery...

    Во первых, выносите логику запроса так же в отдельный класс. Если генерируете новую модель, Gii это может сделать и сам.
    class FooQuery extend ActiveQuery
    {
        /**
         * @inheritdoc
         * @return Foo[]|array
         */
        public function all($db = null)
        {
            return parent::all($db);
        }
    
        /**
         * @inheritdoc
         * @return Foo|array|null
         */
        public function one($db = null)
        {
            return parent::one($db);
        }
    }


    Этот объект передавайте в целевой класс так же как фабрику:
    class Bar
    {
      protected $query;
      public function __construct(FooQuery $query)
     {
        $this->query = $query;
     }
    
     public function someMethod()
     {
        $foo = $this->query->where(...)->one();
        $foo->doSomething();
     }
    }


    Ну а дальше мокайте как и в первом случае
    $queryMock = \Mockery::mock(FooQuery::class);
    $queryMock->shouldRecieve('where->one')->andReturn($fooMock);


    ActiveQuery можно мокать частично, после этого будут выполняться все родные методы, а вот сохранение в базу пропустится.
    $fooMock = \Mockery::mock(Foo::class.'[save, update]');
    $fooMock->shouldRecieve('save', 'update')->andReturn(true);


    Relations можно не подменять вообще. Они прекрасно подставляются через ActiveRecord::populateRelation().

    $foo = new Foo();
    $foo->populateRelation('bar', new Bar());
    Ответ написан
    9 комментариев