Баги в Kohana

На часах 7.42 утра, а я еще не уходил с работы…
Очень срочно нужно доделывать проект, в 11 утра презентация.
Зато параллельно с работой над этим проектом нашел очень неприятный баг в Kohana, заключается он в том что глобальный XSS фильтр, на который многие пользователи надеятся, не работает. Совсем. Подробнее здесь.

Published on Mon, 03 Dec 2007 06:45

Обновления Kohana

PHP фреймворк Kohana о котором я уже писал обновился наконец до полноценной версии 2.0.

Для тех кто не в курсе, версия 1.0 была по сути копией CodeIgniter'a, и никаких особых бенефитов не давала. Теперь же полноценный релиз, новый сайт фреймворка, и ожидание нормальной документации. Пробую её в своём новом проекте, посмотрим что из этого получится. По возможности буду описывать свои впечатления. Пока нравятся следующие вещи (в сравнении с CodeIgniter):

  • Helpers теперь статические объекты, т.е. есть имитация чего-то вроде NameSpace'ов. Таким образом вы можете иметь одноименные методы в разных хелперах, наследовать их и прочее.
  • Поддержка только PHP5. Это очень хорошо, что многие вещи делаются без оглядки на поддержку php4. Я в своих проектах использую только php 5.2+, так что поддержка php4 мне абсолютно не нужна.
  • Продуманное именование контроллеров и моделей, таким образом мы можем иметь одноименные модели и контроллеры, в CI приходилось делать например контроллер News, и модель к нему NewsModel. Теперь благодаря тому что контроллеры должны назваться NAME_Controller, а модели NAME_Model, мы можем иметь одноименные модели и контроллеры. Кроме того, логичнее сделано наследование системных классов. Все системные классы имеют суффикс _Core, хотя в вашем коде эти суффиксы нигде не используются. Т.е. скажем ваш контроллер имеет такое определение: class Welcome_Controller extends Controller { } и создав половину контроллеров вы вдруг решили что вам нужно переопределить этот родительский контроллер, унаследовав системный и добавив некоторые функции. В CodeIgniter'e вам бы пришлось создать класс с таким кодом: class MY_Controller extends Controller { } и описывать работу в нем, а во всех своих контроллерах менять class X extends Controller на class X extends MY_Controller. Теперь же, с учетом того что системные классы имеют суффикс _Core, вы просто переопределяете класс Controller таким образом: class Controller extends Controller_Core { } и больше нигде ничего менять не нужно, потому что у вас и так везде шло наследование от класса Controller, просто вместо него подставлялся Controller_Core

Вобщем сделали многое чуть лучше, минусов пока я вижу всего три:

  • Очень слабая документация, т.е. её практически нет, только API автоматически сгенерированный из кода
  • Слабое по сравнению с CI комьюнити, ввиду малой распространенности
  • Есть еще один минус на мой взгляд - этот фреймворк контроллируется комьюнити, а соответственно он очень сильно уязвим к кривым рукам, людей которые не получают за работу над ним заработную плату. Спорно конечно, может быть это и плюс, но мне кажется что CI всетаки более безопасный в этом плане, и количество потенциальных багов в нем должно быть на порядок меньше чем в аналогичном продукте от сообщества энтузиастов.
Published on Mon, 03 Dec 2007 02:30

Еще один framework который стоит посмотреть

Хочу сам не забыть посмотреть, и с вами поделиться заодно: Framework.php (Frog)

Published on Mon, 26 Nov 2007 21:17

Тест по php от мамбы

Маловато конечно, но будем расти дальше :)

Published on Thu, 15 Nov 2007 11:32

Ubuntu и шумиха о убивании HDD

Последнее время Убунту сообщество очень обеспокоено проблемой убивания Ubuntu 7.10 Gutsy жестких дисков.

Происходит это потому, что Ubuntu, используя настройки из firmware вашего жесткого диска, очень часто паркует головку диска, таким образом постоянно происходит реинициализация, и соотвествующий щелчек. Я долго не мог понять, почему мой Dell Inspiron 1520 переодически щелкает диском, пока не наткнулся на тему на форуме.

Проверить состояние вашего диска, и подвержен ли он этому багу, можно установив пакет smartmontools

Запускаем команду

sudo smartctl -a /dev/sda | grep Load_Cycle
и смотрим сколько раз у нас уже происходила реинициализация. В моём случае это 67171 (столько натикало фактически за пару недель, работы в Gutsy со щелчками). У каждого жесткого диска заявленное максимальное количество реинициализаций разное, но в среднем это от 200 000 до 600 000. Так что делайте выводы.

Решение для меня такое:
Редактируем /etc/hdparm.conf, добавляем в него следующие строки:

/dev/sda {
apm = 255
spindown_time = 0
}
Затем
sudo update-rc.d hdparm defaults
чтобы эти изменения применялись после каждого ребута.

Это эквивалентно выполнению следующих команд:


hdparm -B255 /dev/sda
hdparm -S0 /dev/sda
за исключением того, что команды эти нужно будет набирать каждый раз после ребута, или создавать соответствующие стартап скрипты.

Источник знаний как всегда ubuntuforums.org

P.S. В данной ситуации Ubuntu, да и все линукс сообщество в его лице, выставленно не в лучшем свете, и любители holy wars обязательно напишут что Linux гадость, а Windows в радость. На самом деле все легко объясняется: производители предоставляют Microsoft подробные тех. спецификации своего железа, благодаря которым Microsoft может прикрывать подобные дыры на уровне драйверов, а Linux сообществу к сожалению приходиться тыкать пальцем в небо. А жаль, весьма перспективная ОСь на самом деле…

Published on Tue, 13 Nov 2007 20:34

Picora

Picora - еще один мелкий фреймворк, который стоит посмотреть. В стиле RoR, но на php. Жаль что я его вовремя не увидел :)

Навел меня на него Alex, за что ему огромное спасибо :)

Published on Wed, 17 Oct 2007 18:54

Сюрпризы PDO

Работая с PDO обнаружил такую фишку - все объекты *LOB в оракле он не выбирает при fetch, а вместо этого выдает ссылку на объект типа (stream). Это PHP stream, чтобы его получить нужно выполнить stream_get_contents(). Понятно зачем это сделано, все к оптимизации и удобству, но я бы опционально разрешил вернуть все назад, и выбирать LOB’ы сразу в значения, как это делал например PEAR:DB.

В итоге чтобы выбрать текст новости из поля типа CLOB в Oracle мне пришлось делать так:

function getNewsContent($id) {
$newsq = $this->DBO->prepare("select id,subject,news_body,create_date from news where id=:id");
$newsq->execute(array(":id" => $id));
$newsq->bindColumn(3, $news_body, PDO::PARAM_LOB);
$data = ($newsq->fetch(PDO::FETCH_OBJ));
$data->NEWS_BODY = stream_get_contents($news_body);
return $data;
}
Немного не удобно, но привыкнуть можно.

Кроме того, бился сегодня головой об стену, по поводу того что выбирая фреймворк не наткнулся на Kohana. Она еще конечно сильно бета, но этот фреймворк по заявкам разработчиков - именно то что мне нужно. Там и PDO, там и memcached…
Эх, вот всегда так…

Published on Sun, 14 Oct 2007 18:39

Codeigniter+Oracle = жесть в драйвере

Вы все еще полагаете что в мануале CodeIgniter’а не врут о том что метод

$this->db->escape();
спасет вас от Sql Injection?

Учитывайте, что содержание этого метода в драйвере для Oracle такое:

function escape_str($str)
{
return $str;
}

Доверяй, но проверяй :))

Published on Fri, 12 Oct 2007 20:55

Codeigniter - первые впечатления

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

Первые впечатления такие:

  • Я не знаю как работают другие фреймворки, CodeIgniter я выбрал из соображений легкости, и большого комьюнити. Тормозит. По сравнению с самописным тормозит просто дико. Вобщем-то понятно почему тормозит - куча ненужной “авто-логики”, которая выполняется при каждом запросе. Например поиск подмены для системных библотек CI, пользовательскими. При каждой загрузке страницы он бегает по диску и ищет переписали ли вы какой-то его класс, и какой класс ему использовать. Удобно в разработке, спору нет, но в продакшен не пойдет совсем.
  • Пол вечера возился в проблеме с драйвером oracle - при использовании последовательных запросов, например в цикле (знаю что плохая практика, но поставил бы пива тому кто вытащит одним запросом параметры для запросов к ораклу по разным id, и потом данные по этим id с учетом что у каждого id параметры в запросе будут разные). Так вот, выполняете два select’а, а результаты в обоих случаях получаете от первого запроса. Оказалось глюк - решение здесь. Пока разбирался решил что мне вобщем-то database класс из CI и не нужен - ActiveRecord’ом я все равно пользоваться не буду - т.к. запросы к ораклу в этом проекте на пол-страницы A4 каждый. Вобщем написал простенький враппер к PDO, сразу с поддержкой кеширования и т.п.
  • Кому нужен scaffolding во фреймворке? Нет реально, есть такие люди? Понимаю может быть удобно, но НУЖЕН? Почему бы не сделать эту фичу опциональной? Просто, зачем пихать это во фреймворк? Это же не CMS, чтобы запихивать всего и побольше, чтобы юзер был рад.
  • Сделали скафолдинг, зато не сделали нормальную авторизацию, и возможность сделать back-end по-легкому. Пока решил юзать библиотеку Userlib от пользователей комьюнити, вроде легкая и довольно логично написана.
  • Соответственно родные классы для работы с database-сессиями я пользовать не могу - database то у меня свой :) Вот сижу и переписываю класс session. Если дойдут руки сделать нормально, выложу сюда :)

Пока вроде все впечатления, будут еще - обязательно напишу :) Две мысли пока в голове - надо пока не поздно написать своё попроще, потому что и так большую часть переписываю и думаю надо было всетаки сравнить CI с ZendFramework - что-то мне подсказывает что Zend хоть и еще более монстрообразный, но сделан во многом логичнее.

Published on Fri, 12 Oct 2007 20:09

Highload.ru день первый

Ну вот я и в москве. Не в первый раз конечно, но впечатлений как всегда море. Большой, красивый, современный город. Супер. По Хайлоаду:

  • очень хреновая организация. Начиная с жуткой толпы при регистрации, как в метро в час пик, и заканчивая стоячими местами во время обеда. Я понимаю кофе-брейк подразумевает милые беседы в перерывах за чашечкой кофе, но обед есть обед, должны быть сидячие места.
  • Информации просто гора. Очень интересно. Осознаю что Казахстан в полной **пе в плане веб-технологий. Много интересного, много того что возьмем на вооружение.
  • Раздатка реально отличная. Идея с книгами по конференции просто супер. Учитывая что потока два, мы не можем прослушать весь курс лекций, зато мы можем их прочитать. Что кстати иногда значительно полезнее.

Кроме того, в москве сейчас 4:20 утра, мы сидим в отличном мексиканском баре Pancho Villa, пьем пиво, употребляем мексиканские закуски, все просто супер. Кстати Шоколадница вообще не рулит ни разу - час интернета с весьма посредственной скоростью - 50 рублей. В панчо вилла офигенный интернет абсолютно бесплатно. Нет, и всетаки я люблю этот город :)

Published on Tue, 25 Sep 2007 04:20