Статьи


Блог о веб-разработке от разработчика

Определение

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

Задача

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

Пример далее ...

Иногда необходимо запустить команды на сервере напрямую из PHP скрипта. У меня, к примеру, такая необходимость возникла, когда потребовалось вручную переиндексировать результаты sphinxsearch запроса. 

Я создал скрипт на PHP, который должен был заново переиндексировать базу.

exec('sudo -S /usr/bin/indexer --all --rotate');

К моему сожалению, данная функция не сработала, вернув мне пустую строку. Т.к. у меня уже есть печальный опыт работы с серверами Ubuntu, я быстро осознал, что проблема кроется в правах доступа. Пользотель Apache (www-data) не мог выполнить эту команду. Чтобы пользователь смог, я дал ему возможность запускать indexer от лица администратора (sudo) без необходимости ввода пароля.

Что я для этого сделал?

На сервере в терминале ввёл следующую команду: 

sudo visudo

В конец открывшегося файла (/etc/sudoers.tmp) добавил строку:

www-data ALL=NOPASSWD: /usr/bin/indexer

После чего сохранил файл и снова запустил PHP скрипт. Вуаля! Скрипт отработал и вернул "rotating indices: succesfully", что в переводе с эльфийского означет "успех"!

По аналогии можно дать пользователю возможность исполнять любые файлы на сервере, тут уже всё зависит от вашей фантазии.

andymarrel 23.09.2015 17:00 в Адм. серверов

Настройка временной зоны

Чтобы установить необходимую временную зону на сервере, необходимо запустить следующую команду в терминале:

sudo dpkg-reconfigure tzdata

Данная команда поможет изменить конфигурацию пакета tzdata. Следуйте простым инструкциям и после завершения установки проверьте текущее время сервера командой date.

Настройка NTP синхронизации

Теперь настроим NTP. NTP - это протокол, который синхронизирует время вашего сервера с временем других серверов в сети. Для синхронизации нам понадобится сервис NTP. Устанавливаем его следующими командами в терминале:

sudo apt-get update
sudo apt-get install ntp

Вот и всё! Сервис настроен и полностью функционирует. После каждой перезагрузки демон будет запускаться автоматически и синхронизировать время.

andymarrel 21.09.2015 20:31 в Адм. серверов

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

Длина строки

Длину строки можно узнать при помощи 2-ух функций: strlen или mb_strlen. mb_strlen отличается тем, что может принимать 2-ым параметром кодировку строки.

echo strlen("Hello"); // Выведет 5
echo mb_strlen("Hello", "UTF-8"); // Тоже выведет  5

Кодировка строки

Иногда необходимо узнать кодировку, в которой находится строка. Для этого следует использовать функцию mb_detect_encoding.

echo mb_detect_encoding("Привет всем!"); // UTF-8
echo mb_detect_encoding("Привет всем!", 'ISO-8859-1'); // ISO-8859-1
echo mb_detect_encoding("Привет всем!", "ISO-8859-1", true); // UTF-8

Преобразование массива в строку

Для преобразования массива в строку, необходимо воспользоваться функцией implode. Функция соединит все элементы массива один за другим и вернёт вам строку. Обратите внимание на 2-ой параметр, который принимает функция implode. Этот параметр является связующим звеном между всеми элементами массива.

// Выведет на экран строку "Поцелуй мой блестящий металлический зад!"
echo implode(['Поцелуй', 'мой', 'блестящий', 'металлический', 'зад!'], " ");

// Выведет на экран строку "Поцелуй--мой--блестящий--металлический--зад!"
echo implode(['Поцелуй', 'мой', 'блестящий', 'металлический', 'зад!'], "--");

Замена символов в строке

Я уверен, что с заменой подстроки Вам придётся встретиться ещё не один раз. Для простых случаев замены, используйте функцию str_replace. Для более трудных - preg_replace.

// Заменит "Белоснежный" на "Пурпурный"
// Выведет строку "Пурпурный Галлардо"
$string = 'Белоснежный Галлардо';
echo str_replace('Белоснежный', 'Пурпурный', $string);

// Заменит 100 на слово "Сто"
// Выведет "Сто лет одиночества"
$string = '100 лет одиночества';
echo preg_replace("/\d{3}/", "Сто", $string);

Что такое REST?

REST (REpresentational State Transfer)  - это стиль архитектуры, разработанный для проектирования сетевых приложений (в основном для различных веб-сервисов).

Основные принципы REST

  • Клиент-серверная архитектура
  • Не имеет состояния (сервер не сохраняет состояния клиента)
  • Использование кэша (ответ сервера может быть кэширован)
  • Многоуровневая архитектура
  • Единый унифицированный программный интерфейс (к примеру для получения списка фильмов вы используете URL вида: /v1/movies, а для получения информации о конкретном фильме ваш URL будет: /v1/movies/10)

REST запросы

Для работы с данными REST архитектура использует 4 основных типа HTTP запросов: 

  • GET  - для получения (чтение)
  • POST - для создания
  • PUT  - для изменения
  • DELETE - для удаления

Таким образом, чтобы получить список книг следует использовать GET запрос /v1/books, а для получения информации о конкретной книге - GET запрос /v1/books/10. Обратите внимание, что название ресурса всегда стоит использовать в множественном числе, даже если вы хотите получить информацию только об одной книге. Это позволяет избежать путаницы и стандартизировать интерфейс запросов.

Важные принципы проектирования REST API

1. Используйте только существительные в URL.
Правильно: /v1/cars, /v1/cars/10
Неправильно: /v1/getCars, /v1/showCarInformation/10

2. Метод GET никогда не должен изменять состояние
Используйте метод GET только для получения информации.

3. Используйте множественное число для ресурсов (URL).
Правильно: GET /v1/cars/10
Неправильно: GET /v1/car/10

4. Используйте HTTP статус коды.
Правильно: Status Code: 200 OK
Неправильно: Возвращать статус запроса в теле ответа

5. Используйте версии.
Правильно: /v1/cars
Неправильно: /cars

6. Используйте правильную пагинацию.
С лимитом (limit) и отступом (offset) в виде параметров.
Правильно: /v1/cars?limit=10&offset=10
Неправильно: /v1/cars/10/10

7. Для обозначения сортировки по убыванию или возрастанию, используйте + и -
Правильно: /v1/cars?sort=-price,+date
Неправильно: /v1/cars?sort=price&type=asc

8. Ограничение полей в ответе
Правильно: /v1/cars?fields=id,name,year
Неправильно: /v1/cars/id/name/year и т.д.

Статьи для дальнейшего изучения

http://blog.mwaysolutions.com/2014/06/05/10-best-practices-for-better-restful-api/ - лучшие практики REST API (на английском)
http://habrahabr.ru/post/38730/ - Статья с Хабра про REST архитектуру
http://habrahabr.ru/post/144011/ - Перевод статьи на Хабре про то, как сделать ваш REST API лучше

 

 

 

 

Небольшая шпаргалка по техническому СЕО. Конечно это далеко не все правила, но по возможности и их стоит придерживаться.

Расположение ключевых слов на странице

  • Использовать в заголовке (тэг title) страницы (по возможности ближе к началу тайтла)
  • Использовать в верхней части страницы (к примеру в первом абзаце статьи)
  • По меньшей мере 2-3 раза в теле статьи/страницы
  • По меньшей мере 1 раз в "alt" атрибуте картинки
  • Один раз в URL'е
  • Один раз в мета описании (description)
  • Не стоит использовать ключевые слова в ссылках, ведущих на другие страницы вашего сайта

Оптимизация заголовка (тэг title)

  • Предпочтительная длина заголовка: до 65-75 символов
  • Ключевые слова должны быть ближе к началу заголовка
  • Можно использовать в конце заголовка ваш брэнд.
  • Заголовок должен максимально описывать контент страницы т.к. это именно то, что пользователь увидит в первую очередь

Мета тэги

  • Мета description напрямую не влияет на позиции, но именно его пользователь увидит в выдаче в качестве описания. Наиболее подходящая длина - до 160 символов т.к. остальное будет обрезано.
  • Мета кивордс больше не влияет на поисковую оптимизацию.

URL

  • URL должен отражать суть страницы.
  • Чем короче, тем лучше (но не стоит забывать о том, что URL должен описывать страницу).
  • Обязательно использование ключевых слов (но не злоупотребление)
  • Используйте дефис для соединения слов (пример-хорошего-урла)
andymarrel 02.09.2015 20:17 в SEO

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

Прочитать 10 научных статей (в моём случае тематика - IT) [10/10]
1. http://habrahabr.ru/post/264869/ - Статья коротко рассказывает о gulp и require.js и их преимуществах. Есть примеры кода, но подбробной инструкции по использованию нету.
2. https://moz.com/beginners-guide-to-seo/how-search-engines-operate - Первая часть довольно обширного гайда по СЕО (на английском)
3. http://pgdv.ru/blog/274-seo-prodvizhenie-landing-page - Продвижение посадочных страниц. Информация описана в виде эксперимента компании "Бюро Погодаева".
4. http://habrahabr.ru/post/264741/ - Хорошая мотивационная статья "Как стать крутым дизайнером за 365 дней".
5. https://moz.com/beginners-guide-to-seo/how-people-interact-with-search-engines - 2-ая часть статьи про СЕО рассказывает о том, как люди ведут себя на поисковых сайтах.
6. https://moz.com/beginners-guide-to-seo/why-search-engine-marketing-is-necessary
7. https://moz.com/beginners-guide-to-seo/basics-of-search-engine-friendly-design-and-development - На данный момент для меня это наиболее ценная статья из серии. В ней автор рассказывает о технической оптимизации сайта: как правильно заполнить страницу, что должно быть в заголовке, какие мета теги использовать, а какие нет и т.д.
8. https://moz.com/beginners-guide-to-seo/keyword-research - Ключевые слова и их рол
ь в SEO. Статья очень короткая и поверхностно охватывает только основные моменты.
9. https://moz.com/beginners-guide-to-seo/how-usability-experience-and-content-affect-search-engine-rankings - Как юзабилити влияет на позиции в выдаче. Коротко о главном: основное в СЕО - это качественный контент.
10. https://moz.com/learn/seo/redirection - Про редирект 301 и 302, а также несколько примеров редиректа с использованием .htaccess файла.

Сделать уборку в квартире. Разобрать все вещи (нужные и ненужные) [1/1]
В данном случае, стоит признать, я мухлевал. Разобрал только некоторые вещи на своих полках, а сделать полную уборку руки так и не дошли. На следующую неделю придумаю что-то более оригинальное.

Сходить 3 раза в спорт. зал [3/3]
1. Вышел в зал первый раз за 2 недели. Поход оправдал все мои ожидания: минус по весам и выносливости.
2. День спины
3. Кошмарный день ног. Катастрофическая потеря весов.

andymarrel 17.08.2015 20:31 в Личное