• Как работают языки программирования?

    @xfg
    Все работают одинаково. Скрипт на PHP может быть запущен как демон и работать пока его не остановить. Равно как и в Java, C#, Ruby, Python, Perl можно сделать так, чтобы скрипт каждый раз умирал.

    Строго говоря node.js это не язык программирования, а среда для исполнения javascript кода. Во многих языках есть аналогичные non-blocking i/o платформы, в php это reactphp, в python это twisted, который появился задолго до появления node.js.

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

    @xfg
    Читать логи веб-сервера/базы данных и других демонов, которые принимают участие в работе сайта. Есть сервисы куда можно вываливать все эти логи, чтобы проще было мониторить работу системы.
    Ответ написан
    Комментировать
  • Толковый видеоурок по Chrome Developer Tools?

    @xfg
    Или на крайняк хорошую литературу посоветуйте.

    https://developers.google.com/web/tools/chrome-dev...
    Ответ написан
    Комментировать
  • Для чего используют абстрактные классы?

    @xfg
    Попробуйте основательно разобраться, что такое полиморфизм, особенно одна из его разновидностей - полиморфизм типов.

    Полиморфизм типов часто применяется в php. Вот его суть на вашем примере:

    abstract class ClassName
    {
        abstract public function doSomething($something);
    //не абстрактные методы
    }
    
    class ChildClass extends ClassName
    {
        public function doSomething($something)
        {
            //code
        }
    }
    
    class Main {
      public run(ClassName $class) {
        //code
      }
    }
    
    $obj = new Main();
    $obj->run(new ChildClass());

    Метод в Main::run() параметризован, его параметр $class теперь может соответствовать только дочерним классам вашего абстрактного класса ClassName.

    Зачем это нужно?
    Это нужно тогда, когда у вас может быть несколько реализаций одного и того же компонента. И вы точно знаете, что в будущем вам может понадобиться другая реализация. Например, представьте себе класс кеширования. Согласитесь, что кешировать можно в файл, можно в базу, можно в память и т.д. В таком случае, вы можете выделить абстракцию Cache с общим функционалом для любой реализации и создать наследников CacheFile, CacheMysql, CacheRedis и т.д.

    Теперь когда вам понадобится компонент кеша, то вы можете внедрить его через параметр метода, который параметризирован типом Cache, если такому методу дать что-то другое, то интерпретатор кинет исключение. Вы же получаете гибкость. В любое время вы можете заменить реализацию компонента кеша на другой, просто передав в метод другой дочерний объект абстрактного класса Cache. Вы уже точно знаете, какой у него должен быть контракт и точно знаете, что вам не нужно вносить исправления в тот метод, который использует ваш класс Cache. Вы молодцы, ведь вы только что применили полиморфный принцип открытости/закрытости, одного из принципов SOLID а это значит, что ваш код стал чуть лучше.

    Но, скорее всего, если вы ничего об этом не слышали, то вам следует обязательно познакомиться с Dependency injection container, который будет внедрять нужный компонент автоматически, вместо вас. Вы же лишь будете указывать в конфигах, какую именно реализацию компонента нужно подавать всему остальному коду. Тогда весь ваш проект сможет переезжать с CacheFile на CacheRedis и наоборот с помощью изменения всего одной строчки в конфиге.

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

    Помимо примеров в гугле, смотрите еще и живой код open source проектов.
    https://github.com/yiisoft/yii2/blob/master/framew...
    https://github.com/yiisoft/yii2/blob/master/framew...
    https://github.com/yiisoft/yii2/blob/master/framew...
    и т.д.
    Ответ написан
    Комментировать
  • Подробнее про блокировки и в laravel в частности?

    @xfg
    Вам нужны мьютексы. Можно реализовать разными способами. Но если у вас планируется распределенное приложение, то можно сделать на основе mysql, используя GET_LOCK() и RELEASE_LOCK().

    К сожалению, не нашел готового для laravel фреймворка, но можно сделать самому подсмотрев как сделано у других.

    Задача добиться выполнения приложения в один поток. Мьютекс можно захватывать перед началом работы экшена и отпускать после выполнения.

    mysql> SELECT GET_LOCK('name', 10); //первая сессия.
    mysql> SELECT GET_LOCK('name', 5) //вторая сессия. будет висеть, пока не истечет таймаут в 10 секунд или пока первая сессия не выпустит SELECT RELEASE_LOCK('name');


    Блокировки можно именовать как "controllerName:ActionName". Это значит, что если первый поток взял GET_LOCK("controllerName:ActionName", 10); то второй поток к тому же самому экшену подвиснет и подождет, пока первый поток снимет блокировку. Таким образом, мы добиваемся того, что все запросы к серверу будут выполняться синхронно.

    Также, можно воспроизвести состояние гонки и посмотреть, что будет происходить с приложением, без мьютексов и с ними. Этого можно добиться используя curl в терминале:
    curl -d 'param1=value1&param2=value2' http://mylaravel.app/addBookInfo & curl -d 'param1=value1&param2=value2' http://mylaravel.app/addBookInfo & wait

    В итоге к приложению будет отправлено два одновременных запроса.

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

    @xfg
    Я бы верстальщика заменил на фронтенд разработчика. Бекенд разработчика избавил бы вообще от работы с шаблонами. Они оба программисты и могут друг друга вполне понимать. От бекендера нужен API. От фронтендера трансляция этого API в удобный веб интерфейс для пользователя. Верстальщик больше подходит для верстки бумажных материалов, где-нибудь в типографии или для создания статичных веб страниц. Когда сайт динамический, то верстальщик только ломает весь процесс.
    Ответ написан
    7 комментариев
  • Какую версию nodejs изучать?

    @xfg
    Ну 6, хотя по факту, там от версии к версии немного меняется api, что-то помечают депрекейтед, что-то удаляют/добавляют, обновляют версию движка V8 и всё такое. Глобальных изменений, когда меняется всё и вся, такого нет.

    Вобще это всего лишь платформа для выполнения javascript кода, расширенная собственным api для работы с файлами, потоками и т.д. Если требуется использовать что-то из api nodejs то открыл доку и почитал, какие там есть свойства/методы и что вообще делает модуль. Всё. Это же не язык программирования, скажи что там можно изучать?
    Ответ написан
    Комментировать
  • Можно для тех кто в танке про CSRF?

    @xfg
    4. Get-запросы токенами защитить невозможно

    Возможно, но не нужно. Вам не следует выполнять никаких действий, кроме отдачи контента по get запросу. Для update/delete/create нужно использовать POST если это классический веб-сайт и PUT/DELETE/POST если это RESTful API.

    Пусть клиент отправляет csrf-токен в POST запросе. Пусть сервер при старте сессии сохраняет csrf-токен в сессию. Пусть сервер перед тем как выполнить POST запрос проверит соответствие токена из запроса с тем, что в сессии.

    В базе данных токен хранить избыточно. Сохранив в сессию, вы всегда будете иметь к нему доступ, клиент его изменить никак не сможет.
    Ответ написан
    2 комментария
  • Где искать заказчиков дизайнеру сайтов, если умеешь работать только в фотошопе и вёрсткой не владеешь?

    @xfg
    нет денег на повышение уровня квалификации

    С помощью чего вы собираетесь повышать квалификацию?
    Есть же самообучение. Нужны заинтересованность и время. Курсы, семинары, мастер-классы это впервую очередь бизнес. В конечном счете ваш учитель или учитель вашего учителя изучал всё самостоятельно и не платил за это деньги. Большинство программистов изучает самостоятельно.
    Ответ написан
    Комментировать
  • С помощью чего писать тесты для сайта?

    @xfg
    Из популярных для юнит-тестов
    mocha
    jasmine
    Для end-to-end тестов
    nightwatch
    protractor

    Да, можно тестировать как клиентскую часть, так и серверную. На клиентской части когда пишешь юнит-тесты может возникнуть проблема с DOM, так как не очень понятно, как мокать такие зависимости. Поэтому клиент сайд фреймворки, такие как angular пропагандируют подход к написанию кода таким образом, чтобы бизнес-логика никогда не перемешивалась с DOM. Таким образом всю важную бизнес-логику можно будет покрыть юнит-тестами, без всяких проблем.

    Функциональные (end-to-end) тесты эмулируют поведение пользователя через реальный браузер. То есть end-to-end тест нажимает кнопочки, заполняет поля, ходит по ссылкам. Эти тесты более медленные, чем юнит-тесты. Изменения в верстке страницы могут их поломать. Но они более высокоуровневые, дают убедиться, что страница работает именно так как предполагалось. Не зависят от кода, а следовательно не имеют проблем с DOM в отличие от юнит-тестов.

    Лично я пишу только юнит-тесты. И не пишу интеграционные и функциональные. Юнит-тесты очень быстрые, можно в автоматическом режиме прогонять при каждом сохранении файла проекта. В тоже время они дают приемлемый уровень уверенности в том, что билд проекта скорее будет работать, чем нет. Если писать все типы тестов, то можно выстрелить себе в ногу. Будет медленее. Будет больше проблем с исправлением кучи всяких разных тестов.
    Ответ написан
    1 комментарий
  • Нужен совет, касательно создания чата (PHP or Node)?

    @xfg
    Очень много вопросов. Отвечу только касательно порта. Nginx умеет проксировать websocket трафик.
    location /wsapp/ {
        proxy_pass http://wsbackend:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    Подробнее можно прочитать https://www.nginx.com/blog/websocket-nginx/
    Думаю apache и другие это тоже умеют, но конкретнее сказать не могу, так как не использую их.
    Ответ написан
    Комментировать
  • Как защитить REST API от невалидных запросов?

    @xfg
    Все что выполняется на стороне клиента, можно разобрать и вытащить секретную информацию. Поэтому любое приложение работающее на стороне клиента по определению является небезопасным и авторизовывать его нет смысла. Это можно будет подделать.

    То, что вы хотите можно сделать только с клиентами работающими на стороне сервера.

    Я думаю, что вам стоит еще раз переосмыслить свою задачу. Возможно стоит описать ситуацию подробнее, почему вы пытаетесь совместить несовместимое, с одной стороны закрытый API и с другой публичное мобильное приложение.

    Это так не работает. Нужно выбирать из двух:
    1. Публичный API -> Публичный клиент (выполняется на клиенте).
    2. Закрытй API -> Закрытый клиент (выполняется на сервере).
    Ответ написан
  • Может ли перезагрузка страницы оборвать запись данных в localStorage?

    @xfg
    Если в сторадж последовательно записывается несколько значений, то да, может. Если в сторадж пишется одно значение, то нет, это атомарная операция. Для первого случая вроде есть решения stackoverflow.com/questions/14330477/atomic-operat...
    Ответ написан
  • Почему нет сильной Ecommerce платформы под node.js?

    @xfg
    Потому что на node.js как не пиши, но любое более менее сложное приложение превращается в процедурную лапшу. Абстракций и полиморфизма типов нет, приходится зависеть от конкретных реализаций. В метеоре на котором вы написали свое приложение нет di контейнера, всё валится в глобальную область видимости, используется монго, не поддерживаются транзакции между документами/коллекциями, сильная связанность, тяжело покрыть тестами.

    Впечатление от этого всего, что вернулся в начало 2000-ых. Нужно ждать, пока спецификацию ecmascript допилят до вменяемого состояния. Но я думаю, что к тому времени в том же php уже будет асинхронность из коробки, тем более у разработчиков это в планах.
    Ответ написан
    9 комментариев
  • Правильно ли реализовал подключение к БД?

    @xfg
    echo "Не удалось подключиться к MySQL: {$db->connect_error}";

    В таких случаях нужно кидать эксепшн. Нет подключения к бд - нет смысла выполнять программу, нужно умирать. А если есть смысл, то тогда отлавливать брошенный эксепшн на других уровнях и как-то обрабатывать эту ситуацию.

    Зашивать подключение в модель - плохо. Лучше для этого создать отдельный класс Connection. Вместо mysqli лучше использовать PDO, не завязываться на конкретную базу.

    Вместо сырых SQL запросов лучше взять готовый DAO класс или написать свой, чтобы не зависеть от синтаксиса SQL запросов конкретной базы.

    Закрывать соединение с бд в модели - плохо. Закрывать соединение с бд лучше на уровне приложения, после того, как отработал экшен контроллера.

    Вообще стоило бы почитать про GRASP и SOLID. Наследование не всегда хорошо, иногда лучше использовать композицию и зависеть от абстракций, а не от конкретных реализаций. Тогда будет возможность полиморфно заменять одну реализацию на другую, не ломая OCP из SOLID.

    Посмотрите лучше любой популярный фреймворк, чтобы понять как и что примерно работает.
    Ответ написан
    4 комментария
  • Какой выбрать фреймворк для частичного обновления DOM?

    @xfg
    Никакой. JS фреймворки предназначены для создания клиентского приложения. У вас клиента быть не может, т.к. всё рендерится на сервере. Поэтому только низкоуровневые библиотеки аля jquery.
    Ответ написан
    Комментировать
  • MVC php на пальцах?

    @xfg
    Модель - это любая ваша бизнес-логика, всякие вычисления и запросы к бд. То есть то, без чего приложение впринципе не имеет смысла.

    Контроллер - это посредник между моделью и видом. Он запрашивает данные (вызывает методы) у модели и затем передает их в вид.

    Вид - с помощью полученных данных от контроллера рисует пользовательский интерфейс.

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

    Нужна одна точка входа. Клиент всегда запрашивает только index.php, оно там внутри на основе данных из запроса решает какой контроллер создать и какой метод из контроллера выполнить. Всё.
    Ответ написан
    4 комментария
  • Что все-таки должен уметь делать frond-end-разработчик?

    @xfg
    Бекендер предоставляет api для манипулирования данными, а ваша задача эти данные отобразить конечному пользователю. Взаимодействие с сервером ваша задача. Вы делаете полностью клиент. На каком фреймворке или без, вам решать. Но в подавляющем большинстве случаев пишут classic websites, где клиентская часть генерится на сервере и клиент соответственно писать не нужно, поэтому весь сайт делает бекендер, отдать можно только верстку верстальщику, а фронтендер в таком проекте не нужен.

    Фронтендер такой же программист. Скажем у фейсбука есть API, вас просят написать веб клиент к этому api. И вы должны это сделать. На выходе должен быть готовый продукт, которым уже может пользоваться конечный потребитель. Это фронтендер. Это его отличает от верстальщика, задача которого картинку напилить в html.
    Ответ написан
    Комментировать
  • Правильно ли я использую PHP-DI?

    @xfg
    Неправильно. Внедряйте зависимости, а не контейнер. Вы нарушаете Закон Деметры. Будут те же самые проблемы при классическом подходе к юнит-тестированию, как если бы вы вообще ничего не внедряли и инстанциировали все зависимости прямо в классе.
    Ответ написан
    Комментировать