Апрель 2009

Работа.

29.04.2009

Хороший мне проект достался.
Направленность эротическая. С утра сел поработать, пока никого в офисе нет. Через полчаса пришлось идти в соседнюю комнату, снимать со своей девушки трусики.
Но остаток дня ничего так, нормально поработал.

А ещё чем замечательный — 66 запросов к базе на страницу. Не везде, но вот как минимум в одном месте есть. На странице блогов.
Не выводится при этом ничего почти.
Инфа о юзере — 3 запроса (по таблицам раскидано).
Последние посты (глобально по проекту) — 3 запроса (посты, имя автора по id, количество комментариев).
Популярные записи — 1 запрос.
Это если не join-ить, иначе меньше.

Это так должно быть по уму. В реале на самом деле 66 запросов.
Однако берём и просто запоминаем результаты запросов в течении генерации одной страницы. Остаётся 43. То есть 23 запроса делаются для того, что бы получить из базы информацию, которую мы уже получали десятком строчек кода ранее.
Куда остальные 43 запроса? Например, посты селектятся по одному.
Впрочем, они не зря так селектятся. Инфа тупо складывается в кеш обьектов и повторно берётся уже оттуда. По прочим запросам я тоже прикрутил кеш (зачем делать кеш sql-запросов средствами php? Потому что у нас postgresql, она кешировать запросы не умеет), так что теперь при нажатии F5 всего 3 запроса. 2 делает sfPropelPager, что б посты по страницам выводить и один для количества комментариев, который сделан тупо через executeQuery();

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

Если кто решил, что я ругаю symfony — то зря. Не плохой фреймворк. Для крупного проекта, пожалуй, лучше, чем CakePHP. Последний — это просто обвязка. Хорошо сделанная обвязка. Symfony — сырая, но среда. Неплохие возможности по отладке. И ещё какие-то плюсы были, но я их забыл, пока копался в кишках этого фреймворка. А без кишков никак. Что б получить ответы на простейшие вопросы, например, почему у меня 404 ошибка не настраивается, приходится пролезать на пяток файлов внутрь /usr/share/php/symfony.

Работа.

27.04.2009

В такие моменты хочется всех разогнать и уволить нахер.
Время 12, на работе никого нет и не планируется.
Нахуй, нахуй, ип, через которые проходят все платежи, зарегано на прогера? Плевать на деньги, на которые он может кинуть, когда я ему скажу, что меня заебало, что он, видимо, опять лёг в 4 утра и, видишь ли, не проснулся от будильника. Обидно, что он при этом может довольным остаться.
Работника (что последним взяли), тоже нет. Ему завтра будет сказано, что о болезнях нужны справки. Нет справки — прогул. Вычет из зарплаты.
Студент — ок, студент будет через пару часов. Он хоть и появляется во второй половине дня, но стабильно, всегда.
У прогера, кстати, притензии некоторые к студенту, и это хорошо. Когда будем всё делить, он не будет претендовать, что б работать со студентом.

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

Symfony. Propel.

24.04.2009

Поправьте меня, если я не прав. А я очень хочу неправым оказаться.

Но разработчики symfony сделали нереальную хуйню.

public static function doSelectRS(Criteria $criteria, $con = null)
{
foreach (sfMixer::getCallables('BaseUsrPeer:doSelectRS:doSelectRS') as $callable)
{
call_user_func($callable, 'BaseUsrPeer', $criteria, $con);
}

// more code

return BasePeer::doSelect($criteria, $con);
}

В оригинале — это возможность вешать хуки на функции propel (то есть на работу с базой данных).

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

Сижу вот, думаю, как глобально теперь все эти функции похукать. Конечно, BaseUsrPeer генерится — внести в sfPropelPlugin изменения дело 10 минут. Да и можно просто похукать всё в самом плагине. Но я пока не уверен, что это хорошая идея.
Но идея править 160 файлов в lib/model мне тоже не нравится. Это быстрее, чем придумать нормальный вариант, но это усложнит поддержку. Я уже и так планирую похерить текущую систему кеширования, которая как раз вручную во всех 160 файлах прописана, как не отвечающую требованиям задачи (кеширует далеко не всё. А дописывать её — это каждый раз при возможных изменениях все 160 файлов править).

Болезни.

24.04.2009

Задолбали все вокруг болеть. Ощущение, что вокруг меня потенциальные трупы, разрушающиеся заживо. Прогер болеет раз в неделю минимум. Работник в сегодня болеет третий раз в этом месяце. Слева от меня сидит, с жаром и слабостью. Студент — намного реже, за зиму два раза переболел.
Болеют, кстати, не всегда одинаково. И отравления бывают и похмелье (прогер заебал пропускать работу из-за похмелья, ему аукнется через год) и простуда с гриппом.
Самое главное, что всё такая фигня, которой и болеть-то стыдно. Так же стыдно, как, например, в одежде, забрызганной грязью ходить. Бомжи ходят. Но остальные люди считают разумным одежду стирать и чистить. Тут так же. Такие болезни — это самостоятельный выбор человека. Если у тебя похмелье большое — пей меньше. Если отравления — не ешь всякое дерьмо. Простуда — больше спи, занимайся спортом хоть иногда.
Не можешь, не хочешь, некогда, забываешь — ну что поделать. Диагноз — лох. На таких грех обижаться.

Я видел много кода.

22.04.2009

Так хочется кого-нибудь по-поучать. Да, я в курсе, что это плохо. Скоро не будет хотеться. Но сейчас я в области, в которой комфортно мне старому, где я нетерпим и совершенно нетолерантен, поэтому хочется.

А рассказать про код некому. Разве что текущему ведущему разработчику. Но смысла зря доставать человека не вижу. Здесь в блоге тоже смысла не много. Да и вообще в этом смысла не много. Никому не объяснишь, никого не переучишь. Исключения есть, но они подтверждают правило. Можешь делать — делай. Или не делай. А подкалывать, мол, смотри, как фигово написали, толку мало.

А ведь хочется :) . В проекте 30 модулей и все как из комнаты кривых зеркал. Похожи, но неодинаковые. Сидел сейчас, 10 минут $spectatorId = false в каждый вставлял. Что б нотисы убрать. Можно конечно их скрыть, но это неправильный подход.

Сегодня, думаю, уже возьмусь за функционал. Наконец-то.

postgresql

20.04.2009

Как эспортнуть часть несколько-гиговой базы, что б на локалхосте всё потестить?
Пришлось сделать вот так.

foreach ($tables as $v)
echo «timeout 60 pg_dump -h 000.000.000.000 -U user —inserts -t {$v} dbname > {$v}.sql\n»;

Вывод вставляем в shell-скрипт, запускаем, ждём.

Умнее варианта не придумалось. Pgadmin и phppgadmin не помогли.

Продолжаю разбираться в коде.

19.04.2009

Получил тут официальное разрешение писать про код. И вот что усмотрел пока.

if(isset($_COOKIE['fvar3'])){
//echo $showcookie;
$showcookie = $_COOKIE['fvar3'];
if(!$showcookie){
// code
}

Так выходит (у меня, во всяком случае), когда нет уверенности в том, что хочешь написать. Не представляется точно, поэтому сначала по-присваиваешь бесполезных переменных, проверок наделаешь, а потом код пишешь.

< ? $cookie_col = $_COOKIE['color'];?>
< ? if ($cookie_col):?>
<body style=»background-color: #< ?=$cookie_col;?>«>
< ? else:?>
<body style=»background-color: #369;»>
< ? endif;?>
</body>

Разумнее тут писать вообще без if.

shuffle($fonline);
$fonline = array_slice($fonline, 0, 8, true);

if(count($fonline)>9){
$fonline = array_slice($fonline, 0, 10, true);}
else{
// code
}

Слабо представить условия, при которых выполнится второй array_slice?

Март-апрель.

19.04.2009

… а что изменилось за месяц?
[13:18:25] … много чего.
[13:18:29] … Руками поработал.
[13:18:38] … Постелили линолеум в зале.
[13:18:47] … Сменил трубу на кухне — прорвало.
[13:18:57] … В ванной чинил с переменным успехом.
[13:19:17] … Сорвали сроки по всем проектам, по которым можно было сорвать.
[13:19:46] … С парой клиентов о поддержке пришлось договариваться самому, т.к. кроме меня некому позвонить.
[13:19:55] … не надоело ещё? :)
[13:20:08] … Это я то перечисляю, что мысли меняло.
[13:20:21] … у девушки моей типа бизнес — организация праздников.
[13:21:40] … короч, в этом её бизнесе решать мне приходится. Не то, то есть, что приходится, делаю это я. Заметил, что решать могу.

ORM для чайников.

17.04.2009

Углубляю познания в ORM. Наткнулся на статью для чайников. Расписывают преимущества Object-Relational Mapping.

Есть класс ShoppingCart, с помощью которого вы храните товары (items). Для того чтоб получить суммарную цену товаров клиента можно добавить метод getTotal():

< ?
public function getTotal()
{
$total = 0;
foreach ($this->getItems() as $item)
{
$total += $item->getPrice() * $item->getQuantity();
}
return $total;
}
?>

А теперь представьте сколько бы времени потребовалось на написание аналогичного SQL-запроса.

$sql=»SELECT SUM(`price`*`quantity`) FROM `table` WHERE `client_id`=’{$id}’»;

Sql учить надо, а не «orm rulezz» писать. :) :)

Дело.

17.04.2009

У меня теперь есть дело большое. Пригласили в крупный проект ведущим разработчиком. Symfony+propel, postgresql, memcache.
Не знаю, правда, критерий «крупности», сужу по обьёму аудитории. Взял месяц тестового срока просто разработчиком. В проекте разобраться.

За вчера узнал много всякого нового. Symfony для меня фреймворк новый. Кстати, намного серьёзнее выглядит, чем Cakephp. Серьёзнее — не значит лучше, это будет видно позже. ORM вообще не люблю.

Целый день потратил, что бы разобраться и стартануть всё это дело. Новый проект делается быстро, а вот стартануть имеющийся, желательно без изменений (их конечно, mercurial учтёт, но сливать изменения потом будет тяжело) быстро никак не получилось. Начная с того, что сразу ставил версию 1.2. А проект, оказывается, написан на 1.1. Всё, и ничего не сделаешь, часть плагинов ещё не портирована, не портировать же их самому. Да и на рабочем серве версию менять пока смысла нет.

Проект, кстати, нуждается в рефакторинге. Серьёзно в коде я пока не разобрался, вижу только короткие мелкие вещи. Например вот.

$bonline = array_keys($bonline);
$wannauser = $bonline[mt_rand(0, count($bonline)-1)];

Если кто сразу не понял, сделать то же можно вот так.

$wannauser=array_rand($bonline);