• Попросили проверить код, на что смотреть нужно?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Смотря зачем)). Я когда делаю Code Review критерии следующие:

    * Безопасность:
    - Каждый аргумент метода простого типа должен проверяться на тип в случае его проксирования и на граничные значения в случае обработки. Чуть что не так - бросается исключение. Если метод с кучкой аргументов на 80% состоит из поверки из аргументов - это вполне норм))
    - Никаких trigger_error, только исключения.
    - Исключения ДОЛЖНЫ быть человеко-понятны, всякие "Something went wrong" можно отдавать пользователю, но в лог должно попасть исключение со стектрейсом и человеко-понятным описанием, что же там пошло не так.
    - Каждый аргумент (объект) метода должен быть с тайпхинтингом на этот его класс, или интерфейс.
    - За eval как правило шлю на **й.
    - @ допускается только в безвыходных ситуациях, например проверка json_last_error.
    - Перед работой с БД - обязательная проверка данных.
    - Никаких == и !=. Со swtich - единственное исключение, по ситуации.
    - Если метод возвращает не только bool, а еще что-то - жесткая проверка с ===, или !== обязательна.
    - Никаких условий с присваиваниями внутри. while($row = ...) - тоже идет лесом.
    - Магические геттеры/сеттеры разрешаются только в безвыходных ситуациях, в остальном - запрещены.
    - Конкатенации в sql - только в безвыходных ситуациях.
    - Параметры в sql - ТОЛЬКО через плейсхолдеры.
    - Никаких глобальных переменных.
    - Даты в виде строки разрешаются только в шаблонах и в БД, в пхп коде сразу преобразуется в \DateTimeImmutable (в безвыходных ситуациях разрешено \DateTime)
    - Конечно зависит от проекта, но как приавло должно быть всего две точки входа: index.php для web и console(или как-то по другому назваться) - для консоли.

    * Кодстайл PSR-2 + PSR-5 как минимум, + еще куча более жестких требований (для начала все то что в PSR помечено как SHOULD - становится MUST)
    - В PhpStorm ни одна строчка не должна подсвечиваться (исключением является typo ошибки, например словарик не знает какой-то из аббревиатур, принятых в вашем проекте). При этом разрешается использовать /** @noinspection *** */ для безвыходных ситуаций.
    - Если кто-то говорит, что пишет в другом редакторе и у него не подсвечивается, на эти отговорки кладется ВОТ ТАКЕЕЕНЫЙ мужской половой **й и отправляется на доработку)).

    * Организация кода:
    - Никаких глобальных функций.
    - Классы без неймспейса разрешаются только в исключительно безвыходных ситуациях.

    * Тестируемость (в смысле простота тестирования) кода должна быть высокая.
    - Покрытие кода обязательно для всех возможных кейсов использования каждого публичного метода с моками зависимостей.

    * Принципы MVC:
    - Никаких обработок пользовательского ввода в моделях, от слова совсем.
    - Никаких ***ть запросов в БД из шаблонов.
    - Никаких верстки/js/css/sql-ин в контроллерах.
    - В моделях НИКАКОЙ МАГИИ, только приватные свойства + геттеры с сеттерами.
    - В моделях разрешено использовать метод save(при наличии такого разумеется) только в исключительных ситуациях. Во всех остальных - либо insert, либо update.

    * Принципы SOLD:
    - Никаких божественных объектов умеющих во все.
    - Если метод для внутреннего пользования - private, никаких public.
    - Статические методы разрешаются только в случае безвыходности.

    * Принцип DRY разрешено нарушать в случаях:
    - Явного разделения обязанностей
    - В тестах (каждый тест должен быть независимым, на сколько это возможно)

    * Работа с БД:
    - Запрос в цикле должен быть РЕАЛЬНО обоснован.
    - За ORDER BY RAND() - шлю на***й.
    - Поиск не по ключам (конечно если таблица НЕ на 5 строк) запрещен.
    - Поиск без LIMIT (опять же если таблица НЕ на 5 строк) запрещен.
    - SELECT * - запрещен.
    - Денормализация БД должна быть обоснована.
    - MyISAM не используется (так уж)) )
    - Множественные операции обязательно в транзакции, с откатом если чо пошло не так.
    - БД не должна содержать бизнес логики, только данные в целостном виде.
    - Не должно быть нецелесообразного дерганья БД там, где без этого можно обойтись.

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

    * О людях:
    - "Я привык писать так и буду дальше" - не вопрос, ревью пройдешь только когда поменяешь свое мнение.
    - "Я пишу в vim-е и мне так удобно" - здорово, код консолью я тоже в нем пишу)) но есть требования к коду, если в них не сможешь - не пройдешь ревью.
    - "Я скопировал этот страшный метод и поменял 2 строчки" - это конечно замечательно, но по блейму автор всего этого метода ты, так что давай без говняшек, хорошо?
    - "Оно же работает!" - вот эта фраза переводится примерно так: "да, я понимаю, что пишу полную хрень, но не могу писать нормально потому, что руки из жо", я правильно тебя понял?))
    - "У меня все работает!" - рад за тебя, а как на счет продакшна?
    - "Там все просто" - не используй слово "просто", от слова "совсем". Вот тебе кусок кода (первого попавшегося с сложной бизнес логикой), где там ошибка (не важно есть она, или нет)? Ты смотришь его уже 2 минуты, в чем проблема, там же все "просто"))

    * Всякое:
    ActiveRecord (это я вам как в прошлом фанат Yii говорю) - полное говно, примите за исходную. По факту у вас бесконтрольно по проекту гуляют модельки с подключением к БД. Не раз натыкался на то, что в тех же шаблонах вызывают save, или update (за такое надо сжигать).
    То, что используется Laravel - это печально((. Что бы выполнить требования приведенные выше, приходится "воевать" с фреймворком.

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

    UPD

    Формализировал данные критерии по ссылочке: https://github.com/index0h/php-conventions
    Ответ написан
    55 комментариев
  • Как в Android-браузере убрать эффект от нажатия на ссылку?

    @patator

    Для андроида вот так -webkit-tap-highlight-color: rgba(0,0,0,0); -webkit-tap-highlight-color: transparent; /* For some Androids */

    Ответ написан
    2 комментария
  • Nodejs Почему при парсинге выдает такой ������ ������ b� 2006� тест?

    @kapitan7830
    Кодировка сайта, который парсите и файла, который выводит эту запись не совпадают
    Ответ написан
    Комментировать
  • Подходит Java для ИИ и машинного обучения?

    abyrkov
    @abyrkov
    JavaScripter
    Вопрос лишен смысла. Все равно на каком ЯП нейронку писать, главное - алгоритм понимать.

    P.s. Что все свихнулись на нейронках? Я видел, один человек "пилит" Джарвис. В кавычках потому, что не пилит, а задает вопросы типа "а такая то нейронка лучшая?"
    Ответ написан
    6 комментариев
  • Docker-compose как правильно делать rebuild?

    Insolita
    @Insolita Автор вопроса
    Отчаянная домохозяйка
    Там много....
    В том то и штука что оно не стабильно глючит, а иногда проканывает, иногда нет
    FROM php:7.0-fpm
    
    ENV DEBIAN_FRONTEND noninteractive
    
    #####################################
    # Add configuration files
    #####################################
    COPY php7/files / 
    
    #####################################
    # Non-Root User:
    #####################################
    
    ARG PUID=1000
    ARG PGID=1000
    RUN groupadd -r -g $PGID udocker && \
        useradd -r -u $PUID -g udocker -m udocker
        
    ENV PHP_USER_ID=33 \
        HOME=/home/udocker \
        PATH=/var/www/App:/var/www/App/vendor/bin:$HOME/.composer/vendor/bin:$PATH \
        TERM=linux
    
    #####################################
    # Install system packages :
    #####################################
    RUN apt-get update && apt-get -y install \
                git \
                openssl\
                libssh2-1-dev\
                libssh2-php\
                libssl-dev \
                libxml2-dev \
                libicu-dev \
                libmcrypt-dev \
                libfreetype6-dev \
                libjpeg-dev \
                libjpeg62-turbo-dev \
                libmcrypt-dev \
                libpng12-dev \
                zlib1g-dev \
                mysql-client \
                openssh-client \
                libxml2-dev \
                libpq-dev \ 
                nano \
                yui-compressor \
                linkchecker \
                librabbitmq-dev \
                nodejs \
            --no-install-recommends
    
    #####################################
    # Install PHP extensions :
    ##################################### 
    RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/ && \
        docker-php-ext-configure bcmath && \
        docker-php-ext-install gd \
                               iconv\
                               intl \
                               pdo \
                               pdo_mysql \
                               pdo_pgsql \
                               mbstring \
                               mcrypt \
                               zip \
                               bcmath \
                               soap \
                               opcache
                               
       
    ENV RABBITMQ_C_VERSION 0.7.1
    RUN curl -L -o /tmp/rabbitmq.tar.gz https://github.com/alanxz/rabbitmq-c/releases/download/v$RABBITMQ_C_VERSION/rabbitmq-c-$RABBITMQ_C_VERSION.tar.gz \
     && tar xfz /tmp/rabbitmq.tar.gz \
      && rm -r /tmp/rabbitmq.tar.gz \
       && cd rabbitmq-c-$RABBITMQ_C_VERSION \
        && ./configure \
         && make \
          && make install 
    
    #собссно тоже костыли
    RUN if [ -z `php -m | grep -i "amqp"` ];then  \     
    pecl install amqp && docker-php-ext-enable amqp \
    ;fi
    
    RUN if [ -z `php -m | grep -i "redis"` ]; then \
     pecl install redis && docker-php-ext-enable redis \
    ;fi   
    
        
    #####################################
    # Composer:
    #####################################
     RUN curl -s http://getcomposer.org/installer | php && \
        mv composer.phar /usr/local/bin/composer
    
    COPY php7/composer.json /home/udocker/.composer/composer.json
    COPY php7/auth.json /home/udocker/.composer/auth.json
    
    #ENV GITHUB_API_TOKEN ${GITHUB_API_TOKEN} 
    #RUN sed -i "s/GITHUB_API_TOKEN/$GITHUB_API_TOKEN/g" /home/udocker/.composer/auth.json
    RUN chown -R udocker:udocker /home/udocker/.composer
    USER udocker
    
    RUN composer global install --prefer-dist && composer global dumpautoload --optimize
    
    #####################################
    # Node / NVM:
    #####################################
    USER root
    # Check if NVM needs to be installed
    ARG INSTALL_NODE=true
    ENV INSTALL_NODE ${INSTALL_NODE}
    RUN if [ ${INSTALL_NODE} = true ]; then \
        curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.3/install.sh | bash \
    ;fi
    ENV if [ ${INSTALL_NODE} = true ]; then \
        # Set the ENV
        NVM_DIR=/home/udocker/.nvm \
        # Install NodeJS with NVM
        RUN . ~/.nvm/nvm.sh && \
            nvm install stable && \
            nvm use stable && \
            nvm alias stable && \
            npm install -g gulp bower \
    ;fi
    
    # Wouldn't execute when added to the RUN statement in the above block
    # Source NVM when loading bash since ~/.profile isn't loaded on non-login shell
    RUN if [ ${INSTALL_NODE} = true ]; then \
        echo "" >> ~/.bashrc && \
        echo 'export NVM_DIR="$HOME/.nvm"' >> ~/.bashrc && \
        echo '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm' >> ~/.bashrc \
    ;fi
    
    
    #####################################
    # CLEAN UP:
    #####################################
    
    USER root
    RUN apt-get clean && \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
    
    
    WORKDIR /var/www/App
    CMD ["docker-run.sh"]


    docker-compose.yml
    version: '2'
    services:
      app:
        image: php:7.0-fpm
        volumes:
            - ./App:/var/www/App
        command: "true"
        restart: always
      
      nginx:
        build: ./dockerconf/nginx/
        ports:
            - 8001:80
        links:
            - php
        volumes_from:
            - app
      php:
        build:
          dockerfile: php7/Dockerfile-fpm
          context: 'dockerconf'
        links:
          - redis
          - postgres
        environment:
          - GITHUB_API_TOKEN="${GITHUB_API_TOKEN}"
          - INSTALL_NODE="${INSTALL_NODE}"
        expose:
            - 9000
        volumes_from:
            - app
        volumes:
            - ./dockerdata/logs/nginx:/var/log/nginx
      redis:
         image: redis:latest
         ports:
         - "6300:6379"
         volumes:
         - ./dockerdata/redis:/var/lib/redis
         - ./dockerdata/logs/redis:/var/log/redis
         restart: always
      
      postgres:
         build: ./dockerconf/postgres
         volumes:
           - ./dockerdata/pgsql:/var/lib/postgresql
           - ./dockerdata/logs/pgsql:/var/log/postgresql
         ports:
           - "5400:5432"
         environment:
           - POSTGRES_DB=pgdb
           - POSTGRES_USER=pguser
           - POSTGRES_PASSWORD=pgpass
    Ответ написан
    4 комментария
  • Как загружать CSS assets из NPM используя Webpack?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Для Bootstrap и Font Awesome есть отдельные загрузчики: bootstrap-loader и font-awesome-loader.

    Достаточно просто добавить их в секцию devDependencies в package.json.

    В коде инициализации приложения подключить, например так:

    require('bootstrap-loader');
    require('font-awesome-loader');

    Для шрифтов, в webpack.config.js, прописать примерно такие правила:

    module {
      loaders: [
        {
          test: /\.woff(.*)$/,
          loader: 'url',
          query: {
            limit: 10000,
            mimetype: 'application/font-woff',
            name: 'fonts/[name].[ext]' // путь output, куда будут скопированы файлы
          }
        },
        {
          test: /\.woff2(.*)$/,
          loader: 'url',
          query: {
            limit: 10000,
            mimetype: 'application/font-woff',
            name: 'fonts/[name].[ext]'
          }
        },
        {
          test: /\.ttf(.*)$/,
          loader: 'url',
          query: {
            limit: 10000,
            mimetype: 'application/octet-stream',
            name: 'fonts/[name].[ext]'
          }
        },
        {
          test: /\.eot(.*)$/,
          loader: 'file',
          query: {
            limit: 10000,
            name: 'fonts/[name].[ext]'
          }
        },
        {
          test: /\.svg(.*)$/,
          loader: 'url',
          query: {
            limit: 10000,
            mimetype: 'image/svg+xml',
            name: 'fonts/[name].[ext]'
          }
        }
      ]
    }


    Если понадобится выделить CSS из JavaScript, то можно использовать extract-text-webpack-plugin.

    webpack.config.js:
    var extractTextPlugin = require('extract-text-webpack-plugin');
    // ...
    module.exports = {
      // ...
      module: {
        loaders: [
          {
            test: /\.scss$/, // для scss
            loader: extractTextPlugin.extract('style', 'css!sass')
          }
        ]
      },
    
      plugins: [
        new extractTextPlugin('bundle.css') // вынести css в файл bundle.css в папку output
      ]
    }


    Для копирования других статичных файлов можно использовать copy-webpack-plugin.
    Ответ написан
    Комментировать
  • Почему laravel не хочет запускать локальный хост localhost:8000?

    VGrabko
    @VGrabko
    Golang, Php, Js
    у вас расширений не хватает.
    apt-get install php5-*name modules
    Ответ написан
    5 комментариев
  • Для чего нужен Docker?

    @viiy
    Linux сисадмин \ DevOps
    Представьте что нет никакой ложки докера.

    1) Есть одна физическая машина. Вы устанвливаете софт, разные приложухи, базы, web сервера, заходят тестовые юзеры, что-то запускают. Первая проблема - вы не понимаете кому что надо, кто владелец файлов, приложух, зачем висят демоны и кто за это ответственнен. Как выход, вы решаете это разделить на виртуалки.

    2) У вас есть физическая машина + на ней виртуалки. Вы выделяете под каждую задачу свою виртуалку, там сидят отдельные пользователи, вы навели какой то порядок. Появляется задача - пользователи хотят php 6, а его нет, хотят python3, а его нет, хотят Mongo, а она старой версии. Вы обновляете репозитарии, качаете новые пакеты, ставите, часть пользователей довольны, часть нет - им нужна старая версия какая была. Упс!

    3) Одна физическая машина + еще больше виртуальных машин. Вы разделили всех пользователей так, чтобы никто не дрался за версии софта, если нужен php6 - иди на эту машину, нужен php5 - вот на эту. Все счастливы, но появляются разработчики, которые говорят буквально так - "а у меня на рабочей машине все работает, я перенес все как было на виртуалку, а у меня появляется ошибка missing library libXXX.so.X". И вы понимаете что вам остается только создать полную копию машины разработчика, чтобы софт поехал на этой виртуалке без ошибок... И тут появляется Docker! :)

    4) Docker решает именно эту проблему. Вам не нужно заботится о софте который установлен на сервере/виртуалке. Вы просто берете и переносите софт со всеми "кишками" на другой сервер и он просто работает. Работает за счет того, что все "кишки" это слои файловой системы нанизанные как бисер друг на друга. Дополнительно решается проблема свободного места, т.к слои многократно переиспользуются контейнерами, если вам нужен php + одна библиотека, а другому php + другая библиотека, вы используете (грубо говоря) слой php, а для дополнительной библиотеки делаете отдельный слой, одновременно другой человек делает над php другой слой и вы не деретесь между собой и не видите чужих библиотек. Это грубо и скорее всего ради одной библиотеки никто новый слой не делает, делают слой пожирнее.

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

    sabramovskikh
    @sabramovskikh
    Покупайте
    Ответ написан
    Комментировать
  • Как организовать структуру и деплой проекта с docker?

    KolyaniuS
    @KolyaniuS
    безнадежный оптимист
    Как мне запулить мой проект на этот серв?

    Есть два варианта:
    1. через hub.docker.com
    а) делаете docker login для регистрации на docker-хабе (можно зайти и сделать свой проект приватным чтобы остальным не повадно было)
    б) собираете ваш dockerfile с помощью docker build
    в) затем docker push для отправки слоев на ваш хаб
    г) затем логинитесь на боевом сервере и делаете docker pull для скачивания слоев
    д) docker run
    2. Просто кидаете с помощью scp ваш Dockerfile и файлы проекта на боевой сервер и делаете
    docker build
    Подробнее о командах можно почитать в документации - я лишь описал концепцию
    Как затем производить правки в коде?

    Все просто - залейте ваш проект в любой репозиторий (github, bitbacker, gitlab ...), после внесения изменений просто логинитесь на сервере, заходите в ваш докер-контейнер и запускаете git pull в нужную директорию, затем сборка или т.п. (для автоматизации процесса можно использовать любой CI).
    Проекту нужна БД(куда без нее).

    Очень просто - добавляете новый контейнер (например docker pull mysql), на хабе можно посмотреть информацию о запуске такого контейнера https://hub.docker.com/_/mysql/ и коннектитесь к базе из вашего приложения по внутренней сети вашей docer-системы (docker bridge).
    Ответ написан
    1 комментарий
  • Почему может не работать apt-get на Ubuntu?

    Olej
    @Olej
    инженер, программист, преподаватель
    Куда копать, товарищи?

    У вас нет актуальных списков репозитариев, /etc/apt/sources.list
    Лучше всего содержимое генерировать отсюда: Ubuntu Sources List Generator
    Ответ написан
    Комментировать
  • Responsive заголовки на sass?

    @yaroslavgrishajev
    Может вопрос не совсем понятен... Но на всяки случай скажу, что это делается с помощью media queries
    Ответ написан
    Комментировать
  • Как правильно организовать деплой приложения на Laravel с помощью Git?

    AmdY
    @AmdY
    PHP и прочие вебштучки
    компосер лучше истанавливать из lock файла через composer insatall, без update, чтобы версии совпадали, а то мало ли в новых регрессии.

    т.к. вас нет .env на сервере то нет и ключа для encrypter. нужно создать .env файл и выполнить
    php artisan key:generate

    и права на запись вебсерверу выставить на storage и bootstrap/cache

    laravel.com/docs/5.1#installation
    Ответ написан
    Комментировать
  • Где можно найти мануалы/примеры по использованию Jade в Laravel?

    muhammad_97
    @muhammad_97
    PHP-разработчик
    Файлы jade, styl (scss, etc.), coffee хранятся в resources, затем Gulp'ом собираются в public(/css, /js и т.д.)
    Ответ написан
    Комментировать
  • Как суммировать тысячные в javascript?

    Shutik
    @Shutik
    Погромист халявщик
    замените parseInt на parseFloat:
    var value1 = parseFloat($(".value").text())
    Ответ написан
    1 комментарий
  • Из чего состоит окружение продвинутого php разработчика?

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

    1. docker-окружение
    (в 90% случаев для веб-разработки достаточно php -S 0.0.0.0:8000)
    виртуальные машину становятся нужны:
    - когда надоест переустанавливать хост-систему из-за обилия хлама
    - когда работаешь с несколькими проектами имеющие специфические (разные) настройки окружения(php, web-сервер, база)
    - когда надоест решать проблемы в команде из-за того что по разному настроено окружение

    2. git - система контроля версий
    Помнить что ты и когда изменял, должен не человек, а машина.
    Это необходимо:
    - чтобы не испортить всю работы за прошедший год нажав del
    - чтобы определить кто из команды злодей и все испортил
    - чтобы не думать как перенести свежую версию проекта с одной машины на другую

    3. composer - пакетный менеджер для php
    Нужно, когда лениво помнить все ссылки на все php библиотеки, самому качать их, подключать в автозагрузку

    4. behat + phpspec
    Тесты нужны:
    - когда хочется почувствовать себя безопасности и для сладко спать ночь, забыв о кошмарах о сломанном коде
    - когда в production все снова сломалось
    - когда ты написал одну новую фичу, а сломал три

    5. zsh
    Хорошей консолью приятно пользоваться, работа идет быстрее.
    Консоль есть жизнь, жизнь есть shell.

    6. tmux
    Мало одно окошка в консоли, тогда tmux идет к вам.
    В качестве бонуса получите возможность парного программирования совершенно бесплатно

    7. tmuxinator
    Надоело каждый раз открывать кучу окон для tmux, попробуйте его )
    8. vim
    - Потянуло на что-нибудь необычное?
    - Хочется эффективнее писать код ?
    Ну что открыли vim? В первый раз? Поздравляю закрыть вы его не сможете )
    Вызывает зависимость при частом потреблении


    9. continuous integration сервер
    Вообще ci сервер это одушевленная машина. Это твой тамагочи, ты кормишь его хорошим кодом, он радуется и ты видишь приятный зеленый огонек. Если ты дал с код от скажет что не вкусно. Ну а если ты ему, что гнилое он будет долго на тебя орать плохими словами. Со временем он растет и учится делать более серьезные вещи, и начнет помогать тебе:
    Его скилы:
    - он может сам выполнить 10 минутные тесты
    - подготовить и опубликовать проект
    - рассказать о твоем коде, даже то что ты не знаешь
    Он легко обучается и ты легко сможешь научить его удивительным вещам.

    10. куча линтеров на pre commit hook
    Чтобы ci не кормить плохими продуктами, хорошо бы проверять что ты сделал до отправки на сервер. Что бы не забыть это сделать git сам работу.

    11. gulp
    gulp - это еще один твой помощник.
    как если использовать, как watcher файлов + livepreview, можно забыть о F5 в браузере

    12. bower
    Тоже что и composer но для управления ассетами. Это я о всяких jQuery и Bootstrap

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

    nonlux
    @nonlux
    накрутить можно много и как угодно.
    1. CI сервер их куча разных на любой вкус и цвет
    для repo1 по хуку на какую-нибудь ветку например master или prodaction делаем обновление кода на сервере
    с бд все зависит от организации работы с ней
    если есть механизм миграций, то проблемы вообще нет
    repo 2 заворачиваем в пакет для любого удобного менеджера пакетов npm bower и т.д
    c обновлением по лицензии, я бы не стал ее делать на рабочем сервере сразу, но это вам решать
    2 для удаленной кофигурации так же есть ansible puppet можно их прикрутить
    3 докер - собираете контейнер с приложением, а на сервере тупо обновляете

    короче вариантов много, пробуйте. как правильно никто не скажет. скажут лишь о том что в тренде.
    Ответ написан
    Комментировать
  • Динамическое создание классов (PHP)?

    65536
    @65536
    Рекомендую пересмотреть архитектуру того, что вы делаете. Она должна базироваться на штатных возможностях языка, а не на мутных костылях
    Ответ написан
    Комментировать
  • Почему не отправляется post запрос через ajax в phantomJS?

    EvolDev
    @EvolDev Автор вопроса
    вопрос решён , удалось отправить post этим методом, предварительно запустив phantomjs с
    --web-security=false
    Ответ написан
    Комментировать
  • Gulp.js и модульный coffeescript?

    half-life
    @half-life Автор вопроса
    Сам отвечу на свой вопрос

    Вот такое решение.
    gulpfile.coffee
    bundler =  ->
      browserify
        entries: [ path.src.coffee ]
        extensions: ['.coffee', '.js']
        debug : true
      .transform 'coffeeify'
      .transform 'deamdify'
      .bundle()
      .on 'error', handleError
      .pipe source 'main.js'
      .pipe gulp.dest path.build.js
      .pipe reload
        stream: true
    
    gulp.task 'coffee', ->
      gulp.src path.src.coffee, read: false
      .pipe plumber
        errorHandler: handleError
      .pipe tap bundler

    src/coffee/partials/extra.coffee
    define [], ->
      "My string"

    src/coffee/main.coffee
    define ['./partials/extra'], (extra) ->
      console.log "Returned: #{extra}"

    Ответ написан
    Комментировать