Никогда не используйте NULL

Когда мы вместе с клиентами проводим код-ревью, регулярно наблюдаем одну и ту же картину, которую я считаю проблематичной во многих отношениях – использование null в качестве допустимого свойства или возвращаемого значения. Можно же сделать лучше.

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

Для чего это используется

Примером частого сценария использования может быть внедрение дополнительных зависимостей через метод класса:

class SomeLoggingService {
    private $logger = null;

    public function setLogger(Logger $logger) {
        $this->logger = $logger;
    }
}

 

В большинстве случаев logger будет установлен, но кто-то забудет об этом при использовании вашего сервиса. На сцену выходит второй разработчик и пишет новый метод в этом классе, используя свойство $logger. Во время разработки свойство всегда устанавливается и тестируется по соответствующим сценариям использования, так что разработчики забывают проверять на null – очевидно, это станет проблемой при других обстоятельствах. Вы полагаетесь на то, что методы будут вызваны в определённом порядке, который сложно документировать. Метод getLogger(), создающий нулевой логгер по умолчанию, мог бы решить эту проблему, но не гарантировано, поскольку второй разработчик может не знать об этом методе и просто использовать свойство.

Читать дальше…

Как сделать HTTPS на сайте и защититься от SSL-атак

Обычной установки SSL сертификата может быть недостаточно, поскольку нужно также обеспечить защиту от атак, направленных на сам SSL. В данной заметке пошагово рассказывается как сделать HTTPS на сайте, работающем под Apache и защититься от известных SSL-атак. Для проверки будет использован популярный сервис тестирования HTTPS:

summary-a

 

Читать дальше…

Суперскоростной Symfony с помощью nginx

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

Фреймворки, такие как Symfony, потенциально позволяют создавать суперскоростные приложения. Мы уже видели один способ как добиться этого (путём превращения приложения в HTTP сервер), другой способ заключается в установке обратного прокси перед ним.

В данной статье мы возьмём Symfony приложение и увидим, как увеличить его производительность в 140 раз с помощью nginx.

Читать дальше…

Заметки по Git

borken-pipets

 

Отключение автоматической конвертации конца строк LF в CRLF и обратно:

git config --global core.autocrlf false

Отключение сохранения в репозитории прав доступа CHMOD к файлам:

git config --global core.fileMode false

Если по ошибке запушили в центральный репозиторий гигайбатный бэкап, только так он не будет скачиваться при пулле:

Непосредственно в центральном репозитории выполнить: 
git update-ref refs/heads/%ВЕТКА% %ID_НОРМАЛЬНОГО_КОММИТА%

Читать дальше…

Почему PHP-разработчики думают, что MVC – это архитектура приложения?

Ранее я указывал на то, что Model-View-Controller представляет собой паттерн пользовательского интерфейса, а не архитектуру приложения. Но откуда у PHP-разработчиков возникла идея, что MVC – это в первую очередь архитектура? (Это можно сказать обо всех разработчиках серверной части, не только о PHP)

Я одно время думал, что MVC — это архитектура. Даже после прочтения «Каталога шаблонов корпоративных приложений» Фаулера и, несмотря на то, что MVC предназначался для пользовательского интерфейса, я полагал, что всё правильно понял и делаю «приложение пользовательского интерфейса». Но это было не совсем так; правильнее было бы сказать, что я смешивал проблемы пользовательского интерфейса с основой ядра приложения.

Читать дальше…

Асинхронные контроллеры в Symfony

Асинхронное программирование в последние годы стало синонимом высокой производительности в веб-приложениях со стороны сервера. Во многом это связано с возрастающей популярностью изначально асинхронных JavaScript и Node.js.

Как и многие другие вещи, асинхронное программирование не является чем-то новым. Вы можете использовать этот стиль программирования во многих средах, начиная с Python и заканчивая .NET.

В браузере отдельные события, такие как клик мыши, помещаются в цикл обработки событий (см. What the heck is the event loop anyway?, Филип Робертс), а затем события обрабатываются асинхронно без определённой очерёдности: нельзя точно узнать, когда событие клика мыши выполнится.

Ключевое место в асинхронности занимает I/O. В браузерах данное понятие включено начиная с Internet Explorer 5.0 и популяризировано Gmail в 2004 году. Придуманный метод, AJAX, позволил браузерам выполнять запросы к серверу после первоначальной загрузки страницы.

На сервере неблокирующий асинхронный I/O позволяет, например, продолжать выполнять другие задачи, вместо того, чтобы ожидать выполнения долгих запросов к базе данных. Существует много механизмов для обработки потоков асинхронного кода, такие как фьючерсы/promises, генераторы и наблюдатели.

Так что асинхронное программирование не разгоняет ваш компьютер, чтобы получить более высокую производительность. Оно может только помочь компьютеру использовать более эффективно ресурсы путём устранения потерь времени на ожидание.

Асинхронный PHP

Читать дальше…

Почему Small Backuper использует Rar, а не 7-Zip

2016-01-21_110241

Недавно я выкладывал бету-версию утилиты резервного копирования Small Backuper, и возникли вопросы, мол зачем пропиетарный Rar, который надо ещё отдельно устанавливать (У вас не установлен WinRar?), когда есть открытый 7-Zip и сжатие последнего выше. Давайте объясню.

Читать дальше…

Как очистить кэш иконок Windows

Иногда бывает, что у знакомых приложений пропадают иконки. Как с этим бороться.

1. В Диспетчере задач завершаем explorer.exe:

2016-01-17_175312

 

2. Выбираем «Запустить новую задачу»:

2016-01-17_202330

 

3. Вводим:

ie4uinit.exe -ClearIconCache

2016-01-17_202341

 

И нажимаем «ОК».

4. Затем снова вызываем окно запуска новой задачи и вводим:

explorer

2016-01-17_202356

 

Нажимаем «ОК».

Как установить Stylus в Ubuntu 14.04, 15.10

stylus

Stylus — динамический язык таблиц стилей, разработанный под влиянием Sass и LESS. Третий самый используемый синтаксис препроцессора CSS. По инструкции ниже вы узнаете как установить stylus в Ubuntu Linux.

Читать дальше…

Как установить Android Studio на Ubuntu 15.10

  1. Java SDK (JDK):
    sudo apt-get install default-jdk
  2. GNU Standard C++ Library:
    sudo apt-get install lib32stdc++6
  3. Поддержка KVM:
    sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils
  4. Скачиваем отсюда Android Studio: https://developer.android.com/intl/ru/sdk/index.html#Other «All Android Studio Packages» Linux (внизу). Например:
    wget https://dl.google.com/dl/android/studio/ide-zips/1.4.0.10/android-studio-ide-141.2288178-linux.zip
  5. Распаковываем:
    unzip android-studio-ide-141.2288178-linux.zip
  6. Запускаем:
    android-studio/bin/studio.sh

Как собрать приборную панель для Live For Speed

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

MVI_5069.mp4_snapshot_02.00_[2015.09.21_16.25.04]

Читать дальше…

Как запретить запуск скриптов в определённой папке

Если используется Apache2 сервер, то достаточно просто создать файл .htaccess в нужном каталоге со следующим содержимым:

php_flag engine 0
AddType "text/html" .php .cgi .pl .fcgi .fpl .phtml .shtml .php2 .php3 .php4 .php5 .asp .jsp

Регулятор громкости Windows 7+ на Arduino

Приставка позволяет регулировать громкость Windows 7 и старших версий, когда доступ к программному микшеру затруднён, например, в полноэкранных приложениях и играх. При использовании наушников без переменного резистора, данное устройство может быть очень полезным. К тому же, переменные резисторы имеют обыкновение изнашиваться, создавая помехи и дисбаланс каналов. Управление происходит подачей бинарных сигналов по последовательному порту в управляющее приложение, поэтому устройство лишено описанного ранее недостатка переменных резисторов. Кроме того, в приставке не используются цифровые переменные резисторы, часто ухудшающие качество звука. Для индикации уровня громкости используется светодиодная шкала.

Читать дальше…