• Как сверстать список у которого маркеры в виде градиента?

    nonlux
    @nonlux
    Ребят, чего мучаетесь?
    1. Берем пипетку. Цвет у самого маркера один. У следующего темнее но он один ( не градиент). Просто визуально так выглядит.
    Ну а дальше по решению Дима Турков
    И усе профит.
    + не пишем то, не нужно.
    Т.е не
    Как сверстать такое, чтобы кол-во пунктов было не важно

    А просто сверстать нужное количество.
    Ответ написан
    1 комментарий
  • Как решить конфликт при пулл реквесте?

    nonlux
    @nonlux
    . Твой коммитов в ветке patch-4. Она отстает от ветки мастер. Автор хочет чтобы коммитов был в текущим мастер. Тебе надо сделать git rebase
    Ответ написан
    Комментировать
  • Docker на продакшене, как организовать работу нескольких проектов?

    nonlux
    @nonlux
    Дано
    Хост для проектов.
    БД контейнер одна штука. Хотя я бы взял на каждый проект отдельно. Так легче правами к базе рулить.
    По образу на каждое окружение. (Пхп, питон). Обновление кода через гит. Обновление базы через миграции.
    1. Запускаем jwilder/nginx-proxy на хосте чтобы по быстрому добавлять новые проекты с привязкой домена и ставим питон на хост.
    2. Делаем docker-compose file в корне проекта для разворачивания инфроструктуры проекта. (Контейнеры с окружением и Никс)
    3 пишем на ансибл сценарий обновления обновления проекта (гит пулл, запуск миграции, рестарт компос)
    4 собираем контейнер с gitlab runner в котором установлен ансибл и добавлены ключи для хоста. Определяем для gitlab_ci для допустим мастер ветка после тестов запускает ансибл
    5 Профит

    Зачем дженкинс? Для него 4 пункт такой же.
    П.с собирайте свои контейнеры на alpine и делайте docker squash
    Ответ написан
  • Как писать тесты?

    nonlux
    @nonlux
    Ну тесты бываю разными: и зелеными и красными. ))

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

    Я как ярый сторонник BDD использую два типа тестов feature (читай интеграционные тесты) и spec (читай юнит тесты)

    Итак, features. Берем Behat и херачем кучу тестов по типу:
    Зашел на главную,
    Потыкал чего-то в форме регистрации
    Зашел в профиль и увидел свое имя и фотку на странице
    Profit!

    Вот в целом и получили: "Непосредственно регистрация с занесением в БД", только в этой ситуации нам абсолютно не важно что там в БД. Нам важно чтобы пользователь зарегистрировался и попал в закрытый раздел сайта.

    Для таких тестов хорошо иметь поддержку окружения (prodaction, development, test) в коде, чтобы например можно было капчу отключить или еще какую сложную лабуду не делать.
    Если система замудрена до ужаса придется здесь для тестов все окружение поднимать. А лучще вообще отдать CI такое делать пусть друг трудится.
    Плюс таких тестов например когда пишем сложный фронт - сложный бек и еще более сложнейший бек-бек, то можно одним чохом протестировать работу всего сервиса.

    Следующий уровень абстракции spec:

    Если нам в интеграционных тестах было немного пофиг на БД. Она как бы пишет, но что так за структура абсолютно пофиг. То в случае со спекими нам ВАЩЕ ПОФИГ.
    Мы берем наш класс (функцию) и проверяем что за результаты она отдает. Вместо объектов, с которыми подопытный (объект тестируемого класса), даем ему резиновую бабу (моки и т.п), и смотрим на результаты нашего труда.

    Главное при том и другом подходе нам без разницы, что у нас в кишках мы всегда тестируем публичные свойства системы. В первом случае это реакция на пользователя, во втором публичное API класса.

    Вот как то так!

    P.S тесты надо бы писать до кода.
    Ответ написан
    2 комментария
  • Как называется пакет npm?

    nonlux
    @nonlux
    Ответ написан
    Комментировать
  • Где можно почитать best practices по tdd и bdd для приложений на node.js?

    nonlux
    @nonlux
    Я себе выбрал так:
    specs: mocha + chai.should
    файлы component.spec.js хранятся там же где и тестируемый компонент.

    features: mocha + yadda
    храню в test в корне.

    Вот и усе бестпрактис.
    Ответ написан
    2 комментария
  • Можно ли сделать include в функции php?

    nonlux
    @nonlux
    Почитай на темы:
    - use в функциях (анонимные функции)
    - типы данных в частности указатели
    работающий пример твоего кода:
    <?php
    $v=4;
    $load_mod=function ($name) use (&$v)
    {
     include ''.$name.'.php';
    };
    
    $load_mod('mod_name');
    echo $v;  // v === 5


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

    nonlux
    @nonlux
    - использовать php ruby phyton
    - использовать cms
    - использовать генератор статических сайтов
    Ответ написан
  • Как оптимизировать потребление оперативной памяти?

    nonlux
    @nonlux
    Это консольное решение?
    Зачем все делать нахрапом?1 и1003884 (начало конец цикла) забей как аргумент для cli
    выполни задачу меньшими подходами.
    1 -1000
    1001 -2000
    Ответ написан
    Комментировать
  • Возможно ли читать сообщения с открытого терминала?

    nonlux
    @nonlux
    1. в bash( zsh) есть история
    .bash_history (.zsh_history) файлы из домашней папки пользователя
    Читаем ее и получаем все что происходит во всех терминалах под правами данного пользователя.

    Но использовать как читать так и править можно.

    2. Не терминал - а эмулятор терминала - т.е программа ( прослойка между клавиатурой и ос) если она позволяет логи, запись то можно через нее посмотреть что происходит.

    Например есть tmux менеджер консольных сессий. Он запускается как сервер и к нему можно подключится с несколькими клиентами и тогда получим полную онлайн трансляцию )
    Ответ написан
  • Как в Git вынести часть проекта в отдельное отвествелние?

    nonlux
    @nonlux
    Красноглазил я как-то целую неделю для подобного )

    1. В текущем проекте (проект А) уже имеющем приличное число коммитов решил выделить common ветку для аналогичных целей.
    Делал rebase всей истории по таком принципу
    все общие именения ( не факт что это отдельный коммит ) выкидывал в ветку common, и мержил эти изменения в new_master
    все остальное кидал в new_master
    потом просто перенес master на новую ветку
    Адский труд, но так как проект был полностью покрыт тестами ничего не сломал
    Теперь подход такой все общие фичи в common, а потом merge с master

    2. Далее создал новый репозиторий (проект В) в нем только одна ветка common
    в локальном (проекте A) добавил еще один remote проект В

    Теперь все push только для ветки common шлю в два репозитория

    3. Если понадобился новый проект (проект C)
    клонирую проект В меняю origin на проект C
    ну а c common веткой все тоже самое.
    Ответ написан
    Комментировать
  • У кого из вас есть TDD или BDD в разработке, что конкретно вы делаете, когда, как к этому пришли?

    nonlux
    @nonlux
    Книгу не читал, по этому аналогий привести не смогу
    Пишу на php для веб c bdd

    1. Пишу bdd story.
    ( в моем случае это сценарии behat)
    Для меня bdd story это как функциональные и интеграционные тесты, в которых я проверяю работу всего моего продукта в целом.

    Тут вынес несколько правил для себя:
    1.1. Обязательно формулировать цель (название) сценария
    - Я вхожу в личный кабинет
    - Я создаю новую статью блога
    Это поможет отстраниться от лишнего и не превратить сценарий в кашу

    1.2. Писать на нативном языке без технических подробностей
    Я поначалу долго сопротивлялся писать, что либо кроме файлов трансляции на русском. Но потом вкурил фишку. По сути сценарии у меня превратились не просто в тесты, а мини todo list. Всегда четкий и понятный.
    А избегание технических подробностей помогает забыть о проектирование архитектуры системы на этапе написания сценария.
    И мне гораздо понятнее:
    - Я должен видеть "Отказано в доступе"
    чем
    - Статус код страницы должен быть 403

    1.3. Я(Исполнитель) сценария дурак )
    Сценарий не должен быть замудреным. От должен быть простой и не держать какие-либо данные "в голове".

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

    Я должен быть на странице "Новости"
    assert( $uri, '/news');

    Я вижу заголовок статьи "Эта прекрасная статья"
    assertTextInElement('#newsTitle", $title);

    - Если я имею на руках красный тест, то пришло время для кода..

    3. Написание практически всего кода предшествует у меня BDDSpec
    (в моем случае phpspec)

    И так, я получил ошибку от bahat. Я специально настроил утилиту так что бы она ругалась ошибками разрабатываемой системы.
    В итоге я получаю такую ошибку:
    - uri '/new' not exist

    Это для меня прямое указание к действию. т.е я должен создать новую страницу.
    В рамках моей системы уже существуют правила:
    - новая страница - это новое action у контролера.
    - action должен вернуть массив значений для шаблона
    Опираясь на это я создаю спецификацию для контроллера
    class ControllerSpec  {
      public function it_should_show_news ()
      {
        $this->newsAction()->shouldBeArray();
      }
    }


    И далее код, который пройдет этот тест:
    class Controller {
      public function newsAction() 
      {
         return [];
      }
    }


    4. После этого запустив phpspec я получил зеленый bddspec
    5. После этого cнова возвращаюсь к bddstory
    Получаю зеленый шаг
    6. Возвращаюсь на шаг 2.

    Так начинает расти система и обрастать новым протестированным функционалом.

    До bdd использовал tdd c PHPUnit и был очень доволен, пока не подсел на behat + phpspec
    Ответ написан
    6 комментариев
  • Как в nginx отключить запись PHP message: PHP Notice?

    nonlux
    @nonlux
    в nginx никак
    в php.ini
    php.net/manual/ru/errorfunc.configuration.php#ini....

    а вообще это плохо, лучше это устанять
    Ответ написан
    Комментировать
  • Из чего состоит окружение продвинутого 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 комментариев
  • LESS: как назначать цвета в зависимости от контекста?

    nonlux
    @nonlux
    Less:
    .blocks(@col) {
      & .block {
        color: @col;
      }
    }
    
    .blocks(#fff);
    
    .header, .footer {
      .blocks(#bbb);
    }

    css:
    .block {
      color: #ffffff;
    }
    .header .block,
    .footer .block {
      color: #bbbbbb;
    }
    Ответ написан
    5 комментариев
  • Как в текстовом редакторе vim выделять текст?

    nonlux
    @nonlux
    Попробую обобщить, помню свою панику когда первый раз открыл vim

    Выриант 1:
    - Жмем v (vim переходит visual mode, выделяет все от текущей позиции курсора)
    - двигаем курсор ( можно стрелочками, можно hjkl, можно web%$ как угодно)
    - нажимаем y

    Вариант 2:
    Если речь идет о строках, надо решить эту проблему
    Просто я допустим захлотел скопировать 10, а скопировал 11, как без выделения я это пойму без вставки, наверное что никак

    - набираем :set relativenumber
    - определяем сколько строк надо скопировать по нумерации строк слева (допустим 43)
    - нажимаем y43y

    Профит
    P.S. копировать можно не только строки
    можно слова yw
    можно от текущей позиции до конца строки y$
    можно от начала блока до его конца y%

    Вариантов много и каждый д%#@, как хочет.
    Ответ написан
    5 комментариев
  • Linux - как дать доступ к папке пользователям из группы папки?

    nonlux
    @nonlux
    Сергей +1

    После
    usermod -aG testgroup $USER
    У пользователя не добавляется новая группа автоматически, требуется перезайти им.
    Проверь groups
    Ответ написан
    Комментировать