• Как бы вы организовали выдачу уникального кода?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Вариантов много. Самое простое - использовать UUID, с ними можно предполагать, что дублирования не будет. Можно генерировать код каким-то другим способом и проверять, нет ли его уже в БД (повторять, пока не сгенерируется уникальный код, но тут всё-равно могут быть коллизии).
    Ответ написан
    3 комментария
  • Как правильно строить работу с git?

    @aol-nnov
    это личное дело каждой команды. можно, например, git flow
    Ответ написан
    4 комментария
  • Как менять название города в зависимости от того где находится посетитель?

    Нужно подрубать GeoIP. Базы есть в бесплатном доступе, но они не очень, есть также и платные сервисы.
    А принцип примерно такой: клиент заходит на сайт, ты дергаешь его IP и ищешь по базе.
    Ответ написан
    1 комментарий
  • Как не нарушать SOLID?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    вы путаете инверсию контроля и инверсию зависимости. Давайте по порядку кратенько.

    Зачем нам нужны контроллеры или различные представления данных

    Зачем нам в принципе контроллер? Что он делает? Для упрощения не будет воспринимать контроллер как "один объект" и вместо этого представим себе его как целый слой. Так же заменим слово "модель" словом "приложение".

    Задача контроллера - принять и обработать запрос и выдать ответ. По сути в контексте WEB наш HTTP запрос и ответ это представление, которое хочет получить клиент (браузер, мобильное приложение, SPA, что угодно). HTTP - это интерфейс пользователя (UI) для нашего web-приложения.

    Например что бы независеть от реализации клиента и что бы было удобно мы передаем даты в формате iso 8601 (пример: 2016-07-14T19:40:12Z). Это удобно что бы быть независимым от реализации клиента или сервера. Но это не удобно для нашего приложения. В приложении скорее всего нам удобнее всего работать с объектом типа DateTime. То есть приложение использует абсолютно другое представление.

    Мы могли бы прямо в приложении конвертить DateTime в iso 8601 но тогда мы делаем наше приложение привязанным к одному конкретному представлению, которое хочет получить клиент. К примеру по каким-нибудь причинам известным только темным богам, вам вдруг понадобится быстро прикрутить интеграцию с другим сервисом и те же данные гонять уже в RFC2822. И стало быть уже приложению нужно париться о еще одном представлении.

    Мы могли бы сделать какие-то адаптеры у приложения, и дергать их в зависимости от потребностей, но тогда опять же наше приложение все еще знает о представлении, которое ему собственно не нужно. То есть у нас есть зависимость приложения от его UI что... похоже на "не лучшую идею". И тут на помощь приходит Inversion of Control.

    Что такое Inversion of Control

    Тут название само говорит за себя. Допустим у нас был объект A который дергал объект B, причем объект A по сути и не должен ничего знать об объекте B потому то это не его дело. Принцип инверсии контроля говорит нам о том, что в таких ситуациях именно B должно вызывать A, таким образом меняя направление потока управления. Это позволяет нам уменьшить связанность и повысить зацепление компонентов нашей системы. Так же сделав это у нас может появиться объект C который так же будет дергать объект A. Если говорить о UI - мы просто можем сделать несколько реализаций UI.

    То есть если еще упростить - фреймворк должен дергать ваш код, а не код дергать код фреймворка. Тем самым мы снижаем связанность одного от другого.

    Роутер и контроллеры как реализация UI

    Что бы отвязать приложение от логики формирования представления, вынесем это все в отдельный "слой" и назовем этот слой - контроллеры. Точнее это будет как цепочка адаптеров. Один адаптер (фронт-контроллер по сути) получает Request и делает какие-нибудь вещи с ним. Например проверяет можем ли мы вообще делать подобный запрос. Другой адаптер вызывает роутер и выясняет какой дальше адаптер вызвать. Если следующий адаптер не вызван - надо вернуть 404-ую ошибку. Если же все пошло хорошо - мы вызываем еще один адаптер, который уже будет конвертировать HTTP запрос в какое-то действие приложения (вызов метода приложения по сути).

    Так а инверсия зависимости это что?

    Инверсия зависимости - очень похожа на инверсию контроля но действует чуть по другому. Проще всего будет вглянуть на картинку:

    Dependency_inversion.png

    стрелочка зависимости на первой фигуре выходит за пределы нашего "модуля" и залазит в "чужой", тем самым наш модуль становится зависимым от другого модуля. Яркий пример - у нас есть например SwiftMailer для отправки почты. Нашему коду нужен просто способ отправлять сообщения, а SwiftMailer просто конкретная реализация.

    Если мы не хотим завязываться на SwiftMailer, и дать возможность в будущем изменить способ отправки почты, мы можем в рамках нашего модуля объявить интерфейс а в другом модуле уже его реализовать с применением SwiftMailer. Для упрощение под модулями мы можем понимать неймспейсы например.

    Нужно ли соблюдать принцип инверсии зависимости в случае контроллеров?

    Нет. Контроллеру нужна конкретная реализация какой-то части нашего приложения (ибо приложение главнее UI-ки), иначе в них нет особо смысла. И наше приложение вообще не должно париться о том что есть какие-то там контроллеры.

    будет ли правильным передавать зависимости в роутинге

    Это уже вопрос реализации IoC. Конкретно вы хотите получить что-то вроде Dependency Injection. Вы можете забрать зависимости из аргументов метода экшена. или аргументов конструктора контроллера.... или просто использовать контейнер зависимостей внутри контроллера.... это совершенно не важно. Контроллеры это то место где высокая связанность на компоненты фреймворка более чем допустимы.

    С другой стороны у вас теперь роутинг совмещает обязанность маршрутизации и разруливания зависимостей. Сами понимаете что это как-то нарушает прицип единой ответственности. Этим может заниматься Controller Resolver какой-нибудь.
    Ответ написан
    2 комментария
  • Как наследуются функций в PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    функции не наследуются.

    > Возвращает baseClass, я голову сломал.

    константа эта (__CLASS__) возвращает имя класса в котором вызываемый код вы пишите. Если вам нужен тип инстанса - используйте get_class($this). Он будет возвращать именно тип инстанса с которым вы работаете.

    p.s. завязывать код на имена типов - плохая идея.
    Ответ написан
  • Нужен ли Ubuntu swap при 4 GB оперативки на localhost?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Если только для разработки - попробуйте Vagrant.
    Ответ написан
    Комментировать
  • Выдает ошибку при выводе записей из бд?

    @unity_ultra_hardcore
    Отвратительный код, но конкретно в этом случае переменную $db надо объявить глобальной:
    <?php
    
    require('database.php');
    
    $db = new SafeMySQL();
    
    class Add
    {
        public function showphotos() {
            global $db;
            $data = $db->getAll("SELECT * FROM photos");
            echo json_encode($data);
        }
    }
    
    $test = new Add();
    $test->showphotos();

    А лучше сделать явную зависимость класса Add от подключения:

    <?php
    
    require('database.php');
    
    class Add
    {
        protected $db;
    
        public function __construct(SafeMySQL $db)
        {
            $this->db = $db;
        }
    
        public function showphotos() {
            $data = $this->db->getAll("SELECT * FROM photos");
            echo json_encode($data);
        }
    }
    $db = new SafeMySQL();
    $test = new Add($db);
    $test->showphotos();
    Ответ написан
    Комментировать
  • Синхронизация Denwer и удаленного сервера при помощи Dreamweaver?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Выкинуть в топку первое и второе и выучить наконец git и стандартный workflow разработки ПО.

    А то создается впечатление, что вы к нам из 90х телепортировались. С денвером. ага.
    Ответ написан
    6 комментариев
  • Как настроить sudo для юзеров-программистов?

    borodka_lenina
    @borodka_lenina
    =)
    Советую каждой группе выделить по контейнеру LXC и пусть внутри ковыряются, если нужны какие-то общие ресурсы - пробросить порты до нужных контейнеров.
    Ответ написан
    Комментировать
  • Как настроить sudo для юзеров-программистов?

    mobilesfinks
    @mobilesfinks
    сисадмин *nix
    Мне кажется у вас противоречие: "дать им возможность устанавливать софт" и "ограничить их в установке вредоносного ПО".

    Настройка ВПС и базового окружения делаете вы сами. Для этого есть много инструментов - Ansible, Puppet и др.
    А в sudoers пользователю даёте право только на управление определёнными сервисами (nginx,mysql,php-fpm). Все остальные действия пусть делают под локальным пользователем. Для nginx, например, определяете инклуд файлы которые размещаются в папках пользователей. Ну и со многими сервисами так тоже можно.
    Ну и добавление неосновного ПО пусть по запросу будет.
    Ответ написан
    Комментировать
  • Существует ли PSR для именования полей, таблиц, бд?

    https://github.com/bluzphp/skeleton/wiki/Database-...
    Коротко о главном ;-)
    Ответ написан
    Комментировать
  • Существует ли PSR для именования полей, таблиц, бд?

    27cm
    @27cm
    TODO: Написать статус
    Ответ написан
    Комментировать
  • Как в linux с помощью bash скрипта взять в переменные значения параметров из конфиг файла?

    @alexxandr
    you'll see in memory only 0xDEADFACE
    source /etc/disk2
    Ответ написан
    Комментировать
  • Как написать Subquery в Doctrine Query Builder?

    skobkin
    @skobkin
    Гентушник, разработчик на PHP и Symfony.
    Ответ написан
    Комментировать
  • Что за подозрительная верификация ssl ключей от letsencrypted.org?

    @yellowmew
    Cloud infrastructure, monitoring engineer. SRE
    вы участвуете в бета-программе letsencrypt?
    если нет, то до 16 ноября (срок может измениться, но FAQ время "ч" - 16 ноября), все выпускаемые ими ключи - фейковые и исключительно для тестирования.
    Ответ написан
    Комментировать
  • Как сделать кнопочку на тулбаре для запуска скрипта в PhpStorm?

    @matperez
    Сначала settings -> tools -> external tools - добавляете свое приложение для запуска
    Потом settings -> appearance & behavior -> menus and toolbars -> main toolbar - добавляете свою кнопку на панель.
    Изменять иконку не получится. Можете сделать две кнопки, для запуска и остановки. В самих вызываемых скриптах уже разруливайте работает ли сейчас что-то и нужно ли это остановить или запустить.
    Ответ написан
    1 комментарий
  • Как идет переход с "классики" на DevOPS?

    Singaporian
    @Singaporian
    Нет никаких годных материалов. Точнее они годные только для опытных DevOps. Потому что это культура подхода, а не инструментарий.
    Переход на DevOps делается в три этапа:
    1) Сначала полностью все автоматизируется. По поводу доставки кода вопросы врядли возникнут - Jenkins и Maven известны даже детям. Ну не обязательно они. У каждого языка свои инструменты. gradle, grunt, waf... Но автоматиризровать надо все, включая деплой SQL (LiquidBase, dbMaintain, sqitch и т.д.). Эта часть освещена очень хорошо в интернетах.
    2) Затем убираются все боттл-нэки в работе админов и программистов. Например внедряется Green/Blue-деплоймент. В точках деплоя собственного ПО средства провиженинга (puppet/ansible/chef) заменяются на средства деплоймента (uDeploy например). Устанавливается мониторинг и логирование. На все это тоже есть свои инструменты (Sensu например).
    3) Начинается работа с людьми - вовлечение программистов в ответственность за результат на стороне Ops и вовлечение сисадминов(operations) в результат на стороне Dev (подгон под FHS и все такое). Ключевой момент в том, что людям придется понять, что их ответственность приходит эхом оттуда, где они своими руками не трогали (для этого даже автоматически создают новые энвайронменты всякими докерами и вагрантами). Закоммитил кривой код в IDE, не учел зависимость в пропертях, поправил конфиги не для всех энвайронментов - будешь отвечать и за статический анализ кода и за проваленные интеграционные тесты и за неудачный деплоймент. В обратную сторону тоже самое. Тогда люди начнут действовать по стандартам и настанет искомый результат.

    Ну и само собой надо найти сильного релиз-инженера. Потому что DevOps - это не "построил и ушел". Кто-то должен все время смотреть за новыми организационными проблемами и чтобы транк не попал на UAT, например, а на SIT ушел тот же тэгированный код, которому на DEV провели smoke-тесты, а не обновленный парой вредных коммитов, набежавших за время смоука.

    Сначала скажите, как звучит конечная задача и что из этого уже есть и чего нет. Может чего детальнее посоветую.
    Ответ написан
    6 комментариев
  • Как настроить программу-шпиона для слежки за сотрудниками фирмы?

    Jump
    @Jump
    Системный администратор со стажем.
    Шпионить за сотрудниками это уголовно наказуемое деяние. Можно сесть.

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

    Личную почту, и чаты запретить административно, и закрыть доступ к ним технически.
    Хотите смотреть что делает сотрудник на компьютере - нет проблем.
    Предупреждаете (под роспись), что компьютер, собственность организации и служит исключительно для работы, все действия записываются, контролируются и сохраняются, личными делами заниматься на нем запрещено.

    Вообще такие дела без юриста не делаются.
    Если есть такая задача, составляете план технических действий, идете к юристу организации, чтобы он проверил законность всех действий, и составил нужные документы (например подписи у сотрудников собрал).
    После чего, имея на руках письменный приказ начальства, и юридическое обоснование законности, можно переходить к технической реализации.
    Ответ написан
    Комментировать
  • Что можно написать на Node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js

    Часто применяется для:

    1. Локальные приложения и утилиты командной строки
    • Сборщики и трансляторы
    • Пакетная обработка и сценарии отложенной обработки
    • Скрипты, CLI (интерфейсы командной строки)
    • Генерация документации, отложенное формирование отчетов
    • Сценарии тестирования для других систем

    2. Серверы
    • Серверы веб-приложений и SPA
    • Серверы и API для мобильных приложений
    • Любые другие веб-API (RPC, JSON, REST)
    • Серверы сообщений и трансляция событий (чаты, игры, интерактив)
    • Заплаты на уже готовые системы, написанные на других языках, для реализации вебсокетов, SSE, лонг-пулинга и т.д., т.е. для затыкания дыр, для решения проблем в узких местах уже работающих систем.

    3. Клиенты
    • Оконные приложения (nw.js, node-webkit)
    • Кравлеры, парсеры и сбор данных

    4. Железо
    • Программирование микроконтроллеров (arduino, espruino, tessel)
    • Промышленная автоматизация

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

    И плохо подходит:
    • Вычисления и моделирование, со скоростью математических операций нода и JS, как не типизированный язык, не дают хороших показателей
    • Научные приложения (по тем же причинам)
    Ответ написан
    10 комментариев
  • Как организовать express.js приложение?

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