Задать вопрос
  • Чем отличаются эти две статьи (полиморфизм, PHP)?

    код в статьях не отличается ничем.
    за каким чертом автор №2 решил выпендриться, и объяснить "Что такое полиморфизм на самом деле" с использованием абсолютно такого же примера - останется тайной на века.
    лично меня ни один толком не убедил.

    попробую привести собственный пример:
    <?php 
    
    // базовый класс публикации
    // имеет свойства для заголовка и тела
    // умеет отдавать контент в простейшем виде
    class Publication {
      protected $_header;
      protected $_body;
      
      public function __construct($header, $body) {
        $this->_header = $header;
        $this->_body = $body;
      }
    
      public function getContent() {
        return 
          '<h1>' . $this->_header .  '</h1>' . 
          '<p>' . $this->body . '</p>';
      }
    }
    
    // статья в дополнение имеет еще свойство для имени автора
    // конструктор переопределен для задания имени автора
    // метод getContent переопределен, чтобы дописывать под заголовком статьи имя автора
    class Article extends Publication {
      protected $_author;
      
      public function __construct($header, $body, $author) {
        parent::__construct($header, $body);
        
        $this->_author = $author;
      }
    
      public function getContent() {
        return 
          '<h1>' . $this->_header .  '</h1>' . 
          '<br /><br/ >'. 
          'By ' . $this->author . 
          '<br /><br/ >'. 
          '<p>' . $this->body . '</p>';
      }
    }
    
    // объявление переопределяет только метод getContent 
    // заворачивает вывод в блок определенного класса - так объявление заметнее
    // но сам контент генерируется родительским методом
    class Announcement extends Publication {
      public function getContent() {
        return 
          '<div class="announcement">' . 
            parent::getContent() . 
          '</div>';
      }
    }
    
    // а вот короткая новость, например, не переопределяет метод getContent
    // он ей подходит как есть
    // она только с данными немного шаманит
    class ShortNews extends Publication {
      public function __construct($header, $body) {
        $this->_body = substr($header, 0, 31);
        $this->_body = substr($body, 0, 255);
      }
    }
    
    // а вот и принтер
    // принтер печатает публикации
    // ему пофиг, какие именно - хоть короткую новость мы его попросим напечатать, хоть объявление
    // он знает, что у любой публикации есть метод getContent, результат которого можно напечатать
    // потому что объекты классов статья/объявление/короткая новость - они одновременно и объекты класса публикация
    // это и есть полиморфизм
    class PublicationPrinter {
      public static function print(Publication $publication) {
        print($publication->getContent());
      }
    }
    Ответ написан
    Комментировать
  • Что из этих технологий для чего используется?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Оукей. давайте возьмем ваш пример с fl.ru + чаты.

    mongodb - хипстерская база данных. Для проекта типа fl.ru я бы пожалуй не использовал оную (не потому что монга отстой а потому что я лично не вижу в использовании оной смысла в контексте проекта типа fl.ru. Нам не нужен шардинг, реплекация реализуется нормально на любой нормальной RDBS, документоориентированность не нужна, хотя при грамотном подходе можно было бы реализовать неплохие агрегированные коллекции и оптипизировать селекты... Для себя не нашел у монги ни одного плюса перед RDBS типа PostgreSQL). В любом случае если вы не оставляете выбор - тут у нас будут храниться все данные. Придется потратить время на то что бы избавиться от желания что-то заджойнить и реализовать map/reduc-ы для обновления связанных коллекций. Но зато это будет так по хипстерски!

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

    sphinx - поисковой индекс. То есть если мы должны реализовать вменяемый поиск (например по описанию вакансии) - то стоит его заюзать. Сфинкс не самый дружелюбный зато один из самых быстрых поисковых индексов. Хорошо интегрируется с MySQL и подобными и если сравнивать с ElasticSearch из коробки чуть лучше дружит с русским языком. Но опять же у эластики свои плюшки. Некоторые оной заменяют монгу так как по большинству фич в плане хранилища данных они совпадают.

    redis - мы там вроде чатик делали. Помимо того что redis это хорошее key-value in-memory хранилище, которое к тому же может обеспечить нам надежность хранения данных (мэпится на файловую систему еще), оно так же поддерживает pub/sub. То есть чисто теоритически мы можем не добавлять в стэк штуки типа ZeroMQ и прочие *MQ для реализации авторизации и связи приложения чатика и основного приложения (вдруг у нас чатик будет написан на go/node.js/erlang).

    memcache - вот тут стоит подумать нужен ли он если у нас есть редиска. Раньше для жирного кеша выбор был очевиден - memcached, так как reddis в те времена не поддерживал кластеризацию. Сейчас же по возможностям редиска далеко впереди. Так что даже то что memcached чуточку быстрее (но жрет больше памяти и не поддерживает авторизацию к примеру из коробки) не должно стать поводом для использования оного. Но я если честно redis в кластерах не использовал и ничего говорить не могу, а memcached испытан годами.
    Ответ написан
    1 комментарий
  • Практичное использование orm. Где? Модель? Контроллер?

    SilenceOfWinter
    @SilenceOfWinter
    та еще зажигалка...
    В парадигме MVC работа с данными ведется в модели.
    Я бы описал MVC это как небольшую фирму в которой есть С - секретарша, которая принимает заказ и передает его M - боссу, он в свою очередь говорит V - художнику что и как нарисовать. Полученный шедевр V передает С, которая отдает его клиенту.

    "Студентов и школьников прошу продолжить играть в Dota и не отвлекаться на мой вопрос."
    Яркий пример предвзятого отношения от которого стоит избавляться..
    Ответ написан
    10 комментариев
  • Как сделать редирект с задержкой для yii2?

    miraage
    @miraage
    Старый прогер
    Попробуйте так:

    $meta = [
        'http-equiv' => 'Refresh',
        'content' => '10; url=' . $urlTo,
    ];
    \Yii::$app->view->registerMetaTag($meta);
    Ответ написан
    Комментировать
  • Чем скачать yandex-плейлист целиком?

    @dedmaroz
    Поиск по трекерам ничего не дал, плагины для браузеров качают по 1 записи.

    Написал расширение для браузеров Chrome, Yandex, Opera: https://github.com/egoroof/yandex-music-fisher
    Можно качать как треки, так и плейлисты, альбомы и даже дискографию исполнителей.
    UPD (01.07.15) - добавлена поддержка ID3 тегов!
    Ответ написан
    5 комментариев
  • (Yii2) Как инклудить View файл?

    А просто передать нельзя?
    <?php $this->render('blocks/right_block',['models' => $models]); ?>
    Ответ написан
    3 комментария
  • (Yii2) Оправдано ли использование Bootstrap в несложных шаблонах?

    SamDark
    @SamDark
    Yii2 core team
    В Yii2 bootstrap не внедрён вообще. Просто в фреймворке есть всё, чтобы с ним работать и в поставляемых по умолчанию шаблонах это используется.

    Вот, например, мой шаблон, чтобы работать без bootstrap: rmcreative.ru/blog/post/yii2-minimal

    Ну а вообще с bootstrap приятно.
    Ответ написан
    1 комментарий
  • С чего начать изучение Yii2?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Да, есть официальная документация.
    Только совет - если задумаете что-то написать, потрудитесь поискать уже готовое решение. Главная проблема новичков в Yii - после пары часов прочтения документации они уже подписываются на выполнение заказов на фрилансе, и затем в коде разрастаются велосипеды, реализация которых даже в фреймворке имеется.
    Ответ написан
    Комментировать
  • Как реализовать фасетный поиск?

    nikel303
    @nikel303
    1. Берете характеристики товаров, которые могу участвовать в фильтре, получаете для каждой характеристики все варианты значений для текущей выборки товаров.
    2. Выводите в форму фильтра, значения сгруппированные по характеристикам с инпутом-checkbox.
    3. Пользователь ставит галки, отправляет форму.
    4. Формируете критерий для выборки из базы на основе запроса.
    5. Переходим к пункту 1.

    Для ускорения: индексы, кэш, sphinx
    Ответ написан
    3 комментария
  • Как работает uwsgi для python и Django\tornado конкретно?

    @a_well Автор вопроса
    Решил выяснить сам.
    В итоге, простой вариант:
    uwsgi запускается, инициализирует экземпляр скрипта\апликации и ждет запроса.
    При получении запроса он отправляется на функцию, которая принимает два параметра
    environ и функцию-колбек start_response.
    Это если в общих чертах.

    А торнадо позволяет сделать инициализацию всех систем ранее и потом обрабатывать запросы.
    Ответ написан
    Комментировать
  • Каковы основные принципы регистрации и авторизации через социальные сети OAuth2?

    hbuser
    @hbuser Автор вопроса
    Отвечу сам себе.
    Здесь есть полезная конкретная информация о технической реализации.

    А если вкратце, то...

    Для авторизации, регистрации используется все та же таблица 'users'. Вместе с обычной регистрацией и авторизацией, когда при регистрации (в самом простом виде) в таблицу 'users' добавляются email, password и login пользователя, а при авторизации проверяется соответствие введенных login'а и password'а существующим в базе данных, аналогичным образом используется и регистрация/авторизация через социальные сети. Только в данном случае источником данных о пользователе для его регистрации является не непосредственный пользователь, который вводит данные в форму, а соц. сеть. Регистрация в данном случае достаточно прозрачная, т.е. не видна пользователю. Схема примерно следующая (без особенностей работы Oauth-протокола):


    1) Пользователь выбирает вход через соц. сеть.
    2) Происходит обращение к странице авторизации в этой соц. сети, если человек еще не авторизовывался там. После ввода данных, а если он ранее авторизовывался, происходит запрос на разрешение использования его данных.
    3) Если человек отказывается, то на этом конец. Если дает согласие, то выполняется перенаправление на указанную в настройках Oauth страницу сайта.
    4) У каждого пользователя в соц. сетях есть свой уникальный идентификатор, который можно запрашивать. Для своей таблицы 'users' нужно добавить пару дополнительных полей (например, вот такие): auth_via (enum('native, 'vk', 'mailru', '...')) - для обозначения типа регистрации пользователя, и social_id - здесь будет храниться уникальный идентификатор в соц. сети. Если нужно хранить какие-то специфические данные этого пользователя из соц. сетей, то можно создать доп. поля для этих данных.
    5) После того, как пользователь дал разрешение на использование его данных, необходимо запросить нужные данные от соц. сети, в т.ч. и идентификатор пользователя в соц. сети. Вот здесь и начинается невидимый процесс регистрации. Нужно проверить есть ли в БД пользователь с таким social_id, если нет, то вставляем social_id, данные пользователя из соц. сети, по необходимости, в БД. Все, пользователь зарегистрирован.
    Если же данные о пользователе есть, то необходимо запросить актуальные данные из соц. сети, сравнить их с теми, что в базе и если они изменились, то обновить их и в своей базе данных, если нет, то просто переходим к следующему шагу.
    6) Создается сессия с данными пользователя.

    Таким образом, к существующей таблице "родной" регистрации пользователей сайта присоединяется, условно говоря, таблица, поля, необходимые для регистрации/авторизации через соц. сети., и друг-другу они не мешают.

    ca4a4b263fd1424085988c9deaeb6d5b.png

    Для пользователя, зарегистрированного из соц. сети пароля и логина, естественно, нет. Они нужны для авторизации. А т.к. пользователь авторизуется с помощью своих логина и пароля в соц. сети, то и указывать здесь нечего. И еще, можно при авторизации, к запросу проверки логина и пароля, добавить условие

    'AND WHERE `auth_via`="native"'

    , чтобы исключить пользователей, зарегистрированных из соц. сетей.

    Как видно, для каждого пользователя в таблице создается внутренний (внутрисайтовый, если так можно выразиться) первичный, автоинкрементный ключ. Соответственно, нет разницы для логики сайта между пользователем, зарегистрированным через соц. сеть и через сайт. Если говорить об интернет-магазине, то, для привязки заказов к пользователю, можно использовать единый, внутренний идентификатор ID.
    Ответ написан
    3 комментария
  • Что такое фикстуры и миграции?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Фикстуры - это по сути тестовые данные. Они нужны для unit-тестирования. Это могут быть как данные в базе, так и обычные файлы (обычно 2 варианта, до и после обработки так скажем). Каждый раз когда запускаются тесты, эти данные используются для установления начального состояния системы, что бы тесты всегда выполнялись предсказуемо.

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

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

    @Bandya
    На счет SEO следующие:
    SEOшник SEOшнику рознь.
    Из требований что нужно знать,если Вы Front-End разработчик +SEO, это из той серии когда вы делаете проект под ключ в паре с дизайнером он макет вам в PSD, вы все остальное(верстка, программирование, оптимизация и т п):
    1) HTML
    2) CSS
    3) JS
    4) Jquery
    5) PHP
    6) умение разбирать в чужом коде.
    7) опыт работы с популярными JS-фреймворками;
    8) опыт работы с системой контроля версий (git, svn);
    9) опыт работы с популярными CMS
    Это из серии требований чтобы кодить и верстать:( в чистом виде SEOшником мало видел из друзей)
    Что касаемо SEO:
    1) Алгоритмы поиска
    2) Внутренняя оптимизация(стандарты яндекса и google)
    3) Внешняя оптимизация
    4) Стратегии продвижения
    и много опыта на счет аудита сайта(юзабили, технический аудит и т п).
    5) Знание фильтров ПС и способов вывода из под них.
    p.s. Все зависит "Кем вы хотите стать"

    p.s.2.
    Что касаемо SEO:
    Из опыта:
    1) Общение с заказчиком( уметь предложить продукт и услуги, не продаться дешево)
    2) Технический аудит сайта.
    3) Юзабилити аудит сайта.
    4) Далее аналитика области, просчет рентабельности проекта.
    ( включает составляет семантического ядра, стоимость и сроки вывода в топ, процент вывода в топ и различные факторы)
    5) Далее уже идет сама работа, дизайнер+верстальщик+ прогер+ SEOшник и другие рук. лица в виде технического директора, арт директора, все зависит от проекта.

    p.s3. хороший SEOшник это 50% маркетолог, знает как правильно преподнести товар или услугу.
    Ответ написан
    1 комментарий
  • Какими знаниями должен обладать хороший и востребованный SEO-специалист?

    Perkov
    @Perkov
    — Алло, это SEO агенство?
    — (шепотом) да.
    — А почему вы шепотом?
    — Я сейчас на алгебре.
    Ответ написан
    Комментировать
  • Какими знаниями должен обладать хороший и востребованный SEO-специалист?

    opium
    @opium
    Просто люблю качественно работать
    А зачем ему js , css и тем более php ?
    Ответ написан
    Комментировать
  • Какими знаниями должен обладать хороший и востребованный SEO-специалист?

    Quber
    @Quber
    PHP Team lead
    Из перечисленного надо знать только html, ну и как выводить сайт в топ и нагонять посещалку разумеется
    Ответ написан
    Комментировать
  • Какими знаниями должен обладать хороший и востребованный SEO-специалист?

    Palehin
    @Palehin
    Frontend
    Сеошники это вообще отдельная история. Они в большинстве своем - тупые (по крайней мере в нашей конторе), нифига не знают, работают с парой прог по отслеживанию статистики сайтов и проверки контента на уникальность, надоедают с глупыми вопросами и т.д. Гоните их в шею)
    Ответ написан
    1 комментарий
  • Как правильно использовать исключения?

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

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

    Идея же исключений такая:
    1. У нас есть алгоритм, который должен работать по заданной схеме. Мы нигде на уровне выше не проверяем корректность возвращаемых значений или правильность выполнения уровня ниже - он должен выполниться правильно или не выполниться. Это условие рождается из понимания инкапсуляции - каждый отвечает за свой кусок кода.
    2. Если в какой момент момент, метод (кусок кода), отвечающий за определенную функциональность понимает, что не может выполнить назначенную ему операцию - он сообщает об этом на уровень выше.
    3. Уровень выше может обработать исключительную ситуацию, либо (если не знает как) - передать исключение еще уровнем выше по стеку вызовов.

    Т.е. резюмирую: у нас есть код, который должен в 90% случаев обрабатываться по одному алгоритму и в 10% случаях могут возникать ситуации, когда этот алгоритм в одной конкретной части кода - пойдет по другому сценарию.
    Т.е. ваша задача писать код именно таким образом, чтобы исключения были лишь подстраховкой, а не частью основного алгоритма.

    Интересный момент реализации исключений в lisp: там можно выполнить код вызвавший исключение повторно (например попытаться подключиться к базе второй раз средствами самого исключения).
    Ответ написан
    Комментировать
  • Как удалить вопрос?

    Shultc
    @Shultc
    RnD Developer
    Можно нажать на кнопку «Редактировать» и переделать его на вопрос получше ;)
    Ответ написан
    4 комментария