Статьи

Как сократить количество правил в ACL (Access Control List)?

Posted in Статьи on февраля 19, 2009 by korchasa – 4 Comments

Главная проблема ACL – ее размер

Из этой проблемы формируются две гадости: во-первых правила долго писать, во-вторых по ним искать сложно. Попробуем пойти нестандартным путем и решить проблему, сделав роли более селективными.
read more »

Лебедь, рак и щука: огранизация работы нескольких программистов на малых и средних проектах

Posted in Статьи on ноября 21, 2008 by korchasa – 2 Comments

Для начала определимся с тем, что мы делаем. Обычно наш продукт состоит из:

  • сервера или нескольких серверов
  • настроек сторонних приложений (http-сервера, СУБД, прочие хранилища данных и утилиты)
  • нашей схемы размещения файлов (фото, видео, и прочий хлам контент)
  • наших кэшей
  • нашей структуры БД
  • нашего кода
  • бессоных ночей

Начнем с конца, пропустив бессоные ночи.

read more »

Сеанс консольной магии: анализ access логов nginx'а.

Posted in Статьи on ноября 7, 2008 by korchasa – 11 Comments

О том, что где-то рядом живут sed, grep, awk и pipelines, я узнал еще года 4 назад, но использовать (с толком) их не приходилось. Пока не захотелось странного…

read more »

Dog-pile эффект. Как отгонять стаи собак.

Posted in Статьи on апреля 18, 2008 by korchasa – 3 Comments

Dog-pile эффект — ситуация когда кэш протухает, а большое количество запросов генерирует высокую нагрузку на источник данных, из которых строиться кэш. read more »

Организация "кусочкового" кеширование HTML

Posted in Статьи on апреля 8, 2008 by korchasa – 3 Comments

Навеяно парой статей на Хабре, и тем, что вчера сделал cache тег для Macro.
read more »

Тесты производительности различных cache storage

Posted in Статьи on марта 20, 2008 by korchasa – 9 Comments


Version 0.4

Ну вот опять!

Передо мной в данный момент стоит задача сравнить популярные бытрые хранилища данных, основанные на использовании оперативной памяти. Найденные сравнения(например, вот это) не совсем подходят, так как необходима информация не только о скорости get/set операций, но и о add/delete (их предполагается использовать для создания мьютексов).
read more »

PHP 5.3: что пых грядущий нам готовит?

Posted in Статьи on февраля 22, 2008 by korchasa – 4 Comments

То о чем так долго говорили большевики…

Кратенько:

  • пространства имен
  • mysqlnd
  • позднее статическое связывание
  • динамические вызовы статических методов
  • Прочие изменения

А теперь подробно…
read more »

Меньше кода ?== больше ям

Posted in Статьи on ноября 15, 2007 by korchasa – Be the first to comment

Вроде бы все всё знают, но почему не все всё используют? Меньше кода, хорошего и разного? Или читаемость все таки теряется?

1. Присвоение в сравнениях

Больше:

$id = $request->getId();
if(!$id) {
 return false;
}

Меньше:

if(!$id = $request->getId()) {
 return false;
}

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

2. Тернарный оператор, вместо if

Больше:

if($id) {
 return $id;
} else {
 return false;
}

Меньше:

return ($id) ? $id : false;

Читаемость нисколько не снижается. ИМХО их и объединять можно:

$a = ($a) ? a : ($b) ? $b : 'default';

3. “Вытаскивание” элементов массива в текущий контекст

Больше:

function resolveArray($params) {
 if(array_key_exists('foo', $params)) {
   return $params['bar'];
 }
}

Меньше:

function resolveArray2($params) {
 extract($params);
 if(isset($foo)) {
   return $bar;
 }
}

или

function resolveArray3($params) {
 list($foo, $bar) = $params;
 if(isset($foo)) {
   return $bar;
 }
}

Использование extract – несколько порочная практика, ибо непонятно откуда переменные берутся. Использование list’а в этом плане лучше, но он завязан на порядок следования элементов…гад.

Поэтому в больших методах лучше все таки вытаскивать “ручками”:

function resolveSomeArrayInformation3($params) {
 $foo = array_key_exists('foo', $params) ? $params['foo'] : false;
 $bar = array_key_exists('bar', $params) ? $params['bar'] : false;
 if(isset($foo)) {
   return $bar;
 }
}

, ибо можно нормальные значения по умолчанию задавать и наглядность не теряется. А если писать влом, то используйте возможности вашей IDE (она же позволяет использовать шаблоны, правда?).

4. Инициализация в объявлении цикла

Больше:

$count = count($array);
for($i = 0; $i < $count; $i++) {}

Меньше:

for($i = 0, $count = count($array); $i < $count; $i++) {}

Вполне нормально для меня, для остальных, говорят, не очень.

5. Операции в объявлении цикла

Больше:

for($i = 0; $i < 10; $i++) {
 $str .= $i;
}

Меньше:

for($i = 0; $i < 10; $str .= $i++);

Тоже самое, что и в предыдущем.

6. Простое позиционирование в строке

Больше:

$current_letter = substr($str, $i, 1);

Меньше:

$current_letter = $str{$i};

Читаемость лучше, однозначно стоит применять.

И так далее...

Функциональное тестирование (FunctionalTesting) и Web

Posted in Статьи on октября 15, 2007 by korchasa – Be the first to comment

Функциональное тестирование – процесс, в ходе которого, готовая программа проверяется на соответствие требованиям того на чьи деньги мы пьем кофе. Главная задача функционального тестирования – говорить, либо “странно, но ты ничего не сломал”, либо “я так и знал, теперь чини”.

Функциональное тестирование называют также тестированием “черного ящика”, то есть тесты, в идеале, не должны ничего знать про тестируемую систему. Это позволит менять разработчиков архитектуру, язык приложения, базу данных.

Что тестировать?

Функциональное тестирование для web-сайтов подразумевает эмуляцию работы конечного пользователя: открытие страниц, переход по ссылкам, заполнение и отправка форм, проверка значений полей форм, наличие определённого текста на страницах, получение почты, отправку файлов, а также попытки взлома, и кривизну рук.

Например, есть форма регистрации. Для каждого из заполняемых полей мы должны проверить все граничные условия, даже самые извращённые. В итоге получается по 2-3 проверки на поле.

  • email (заполнен, соответствует паттерну, уникален на сайте)
  • пароль (заполнен, не содержит “нехороших” символов)
  • подтверждение пароля (заполнен, соответствует паролю)
  • псевдоним (заполнен, не содержит “нехороших” символов, уникален на сайте)

После этого мы должны проверить, что нам пришло “правильное” письмо, не пришло неправильных.

Из за использования метода addRecipient(), вместо setRecipient(), у класса PHPMailer, мы однажды разослали 15 000 писем нашим пользователям. По 50-70 штук на каждую невинную жертву. Если бы тест проверял наличие лишних писем, то все бы было хорошо, а так – по башке получили. Хорошо хоть в спам-лист не попали.

Часто функциональное тестирование выполняется специально натренированным человеком со стойкой психикой и любовью к механической работе. Его вооружают листочком с описанием теста и ограждают от окружающего мира, так как не понятно, как он отнесётся к программисту, из-за ошибки которого, ему пришлось опять полностью обходить весь сайт. Ошибаться этот тестер не должен, так как если ошибка пройдет в релиз, ее увидят все, и время ее исправления будет зависеть от ее близости к основным пользовательским “маршрутам”. Такой подход с легкой руки сослуживца получил название wiki-тестирование.

Чем тестировать?

Есть два больших лагеря продуктов для функционального тестирования:

  • Эмуляторы браузера, написанные на языке высокого уровня: httpUnit, JWebUnit, WebTester из SimpleTest
  • Продукты использующие API браузера (например через JavaScript), и и управляющие его поведением: Watir и Selenium

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

Среди вторых хочется отметить Selenium, который уже стал стандартом де факто, для автоматизации функционального тестирования веб-приложений, ибо:

  • для описания тестов используется HTML
  • поддерживаются все популярные браузеры
  • распространяется под лицензией Apache 2
  • начинался проект под патронажем ThoughtWorks, владельцем которой является, некто, Мартин Фаулер

Продолжение следует…

Враг не пройдет. Как остановить спам боты.

Posted in Статьи on июня 6, 2007 by korchasa – 7 Comments

То ли мне спам-боты надоели, толи просто решил сделать что-то большое и чистое. В итоге размышлений родились мысли. Первая, о том, что хочется есть, а вторая, что думать надо усердней. Стал думать усердней, и набросал несколько вариантов защиты:

Защита от ботов, ориентированных на CMS, и названия полей

Тут все относительно просто. Достаточно выделиться из серой массы, и количество ботов снижается почти до нуля. Пример: на странице регистрации можно присваивать id-шникам input’ов случайные значения, подписи к ним выводить с помощью JavaScript, и между некоторыми вставлять поддельные input’ы. Дополнительно можно проверять время заполнения формы, и нажатие клавиш.

Защита от ботов, которых пишут “под вас”

Вот несколько способов пришедших на ум.

Различение формы предметов, и их цвета

Найти на картинке, покрытой мелкими треугольниками, овалами, и прочими линиями квадрат, и указать его цвет.

Плюсы:
  • простота реализации
  • простота прохождения людьми
Минусы:
  • узкий словарь (основных цветов и форм мало, чтобы предотвратить брутфорс)
Разбор сложных образов

Указать пол человека, изображенного на фотографии.

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

Если придумаете, то, пожалуйста, скажите мне . Только гугловский поиск по медиа-контенту не предлагайте, так как он не очень релевантный.

Конструирование сложных образов из кусков

Собирание пазла.

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

Заключение:

Вывод простой – серебрянной пули, как всегда, не получилось, но идея с пазлом мне нравится.