В одном моем проекте используется куча разных jquery плагинов, что сделало процесс обновления самого jquery довольно трудным, ибо везде что-то отваливается, какие-то из них не обновляются с выходом новых версий самого jQuery и т.п. Но вчера я всетаки решил обновиться, и одним из плагинов который пришлось допиливать самому оказался History/Remote плагин. Перестал он работать, как оказалось, из-за того что селекторы Xpath вида [@attribute] были какое-то время deprecated, а теперь и вовосе перестали работать. Вместо них нужно юзать [attribute], т.е. просто убираем знак “@”. В частности в указанном выше плагине, код $('a[@href$="' + iframeHash + '"]‘).click(); поменялся на $('a[href$="' + iframeHash + '"]‘).click();, и все прекрасно заработало.

Мелочь когда знаешь куда смотреть, но проблема когда в интернетах этого не пишут ) Так что хозяйке на заметку )))

При переносе проекта с apache+mod_php на nginx+php-fpm, столкнулся с довольно непонятной проблемой при работе с Ораклом через PDO. Дело в том что, как я писал раннее, чтобы выбрать значение *LOB поля из Оракла, нужно сделать определенные манипуляции, и получив при fetch’e php_stream, сами данные получить путем stream_get_contents. Так вот, один и тот-же код под apache возвращает валидный stream, и соответственно все хорошо работает, а под nginx + php-fpm - пустую строку. Где копать непонятно, гугл очень немного знает про связку оракл+pdo+php-fpm, не говоря уже об nginx. Может быть у кого-то есть идеи?
Код такой:

function getNewsContent($id) {
$newsq = $this->DBO->prepare("select id,subject,news_body,create_date,owner_id from news where id=:id");
$newsq->execute(array(":id" => $id));
$data = $newsq->fetch(PDO::FETCH_OBJ);
$data->NEWS_BODY = stream_get_contents($data->NEWS_BODY);
return $data;
}

если последовать мануалу, и добавить туда bindParam() таким образом:

function getNewsContent($id) {
$newsq = $this->DBO->prepare("select id,subject,news_body,create_date,owner_id from news where id=:id");
$newsq->execute(array(":id" => $id));
#$newsq->bindColumn(3, $lob, PDO::PARAM_LOB);
$data = $newsq->fetch(PDO::FETCH_OBJ);
$data->NEWS_BODY = stream_get_contents($lob);
return $data;
}

то php-fpm вообще вылетает с дампом памяти в логе, и ошибкой OCI-21500, которая по сути является “внутренней ошибкой без описания”. Вобщем вилы, куда копать непонятно, но врагу не сдается наш гордый варяг ))
Если кто-то в курсе, или работал в такой связке - помогите пожалуйста )))

PHP+Oracle Faq

In: work

16 Апр 2009

http://download-west.oracle.com/otndocs/tech/ias/portal/files/RG/complete_web_site_php_faq2.htm
Полезнейший FAQ от ораклов, о том как их чудо-продукт всетаки заставить работать с похапе.

На заметку.

Отсутствующие локали
При отсутствии на сервере нужной локали, например ru_RU.CP1251, можно легко её добавить:
localedef ru_RU.CP1251 -i ru_RU -f CP1251
после этого проверяем, появилась ли она, командой
locale -a | grep ru

Переменные окрежения
Как известно, большая часть неочевидных проблем в линуксе связана с переменными окружения.
Чтобы понять, как так случилось что из консоли ваш демон запускается и работает правильно, а при запуске из init.d что-то не так (например у меня переставал коннектиться к Ораклу, или слетала локаль), достаточно сделать тестовый вывод переменных среды окружения в инит скрипте.
На примере стартового скрипта php-fpm, добавляем в него после #/bin/bash следующую строку:
export > /tmp/envvars и перезагружаемся. Смотрим что там есть, перегружаем руками и смотрим что изменилось. Делаем выводы каких переменных окружения не хватает, и добавляем их прямо в тестовый скрипт. Не слишком красиво, но чаще всего достаточно и такого решения.

Rewrite Rule для CodeIgniter и nginx
В интернетах куча вариантов этих rewrite-rule’ов, у меня же заработал такой вариант (полный конфиг vhost’а):

server {
   listen 80;
   server_name yourhost.com;
   index index.php;
   root /www/yourhost.com/htdocs;
   access_log  logs/yourhost.com_access.log;

   location / {
      #error_page 404 = 404.html;

        if (-f $request_filename) {
            expires max;
            break;
        }

        if ($request_filename !~ (js|css|images|robots\.txt|index\.php.*) ) {
            rewrite ^/(.*)$ /index.php/$1 last;
        }
   }

   location ~ .php$ {
      fastcgi_pass 127.0.0.1:9000;
      fastcgi_index index.php;
      include /usr/local/nginx/conf/fastcgi_params;
   }

  location ~ /index.php/
  {
    include /usr/local/nginx/conf/fastcgi_params;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /www/yourhost.com/htdocs/index.php;
    fastcgi_param  REQUEST_URI      $request_uri;
    fastcgi_param  QUERY_STRING     $query_string;
    fastcgi_param  REQUEST_METHOD   $request_method;
    fastcgi_param  CONTENT_TYPE     $content_type;
    fastcgi_param  CONTENT_LENGTH   $content_length;
    fastcgi_param  HTTP_REFERER     $http_referer;
    fastcgi_pass   127.0.0.1:9000;
  }

}

Ну и в конфиге самого CodeIgniter’a нужно указать что $config['uri_protocol'] = “REQUEST_URI”;

Starting httpd: (98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs!

при возникновении такой ошибки на боевом сервере, обычно после apachectl stop, меня охватывала паника, и все на что хватало воспаленного мозга - reboot в консоли. Учитывая что процессов апача запущено не было, а на 80м порту висела пара FIN_WAIT’ов, выбора казалось бы нет ))) И так было не раз.

Стоило чуть задуматься немного погуглить, и нашелся простейший ответ:
netstat -lnp | grep ':80' в моем случае подсказало мне, что 80й порт каким-то чудом умудряется занять memcached, за что он моментально наказывается killall -9 memcached :))

Вот такие дела. Воистину, reboot - крайняя мера в линухах ))

В очередной раз пытаюсь найти жизнь на марсе, и пересесть на линукс на рабочей машине :) Пока со скрипом, но идет.

Хинт для двух мониторов, который я искал почти целый день:
Для того, чтобы при включенном TwinView кнопка maximize (развернуть окно на весь экран) работала только для одного монитора, нужно в /etc/X11/xorg.conf в секцию Screen втавить такую штуку:
Option          "NoTwinViewXineramaInfo"        "False"

РФЦА жжот ;)

In: work

20 Ноя 2008

Не перестаю удивляться масштабам РФЦА - вот еще один сайт для народа запустили, по всему городу реклама на билбордах - http://www.fingramota.kz :)
Интересные люди вообще, умом мне их не понять :)
P.S. Это еще и не говоря о том что на карте проезда в их академию написано “Ул. Фурманого” :)

P.P.S Для истории, на случай если к моменту просмотра сайта там уже будет все хорошо: по указанному урлу расположен корявый jpg с макеом будущего сайта ;) Они, насколько я понимаю, еще с дизайном не определились, видимо случайно госбюджет кончился, и дальше корявого макета дело не пошло ;)))

ZCE: Zend Certified Engineer

In: php

17 Апр 2008

Zend Certified Engineer
Поздравьте меня, теперь я - Zend Certified Engineer :)

Экзамен сдавал в Москве, в центре тестирования Интерфейс. Очень хороший, внимательный и отзывчивый персонал. Пришел раньше, меня напоили кофе пока регистрировали, потом отвели в отдельный кабинет с видеокамерами и начался тест :) Скажу сразу, что реальный тест мне показался более сложным чем тестовые которые можно купить на сайте Zend, и к концу теста я был уверен что завалил :) Но оказалось нет, видимо интуиция спасла меня в тех вопросах, ответов на которые я не знал. В целом впечатление от теста непонятные - периодически настолько необоснованно сложные вопросы были, что я разводил руками… Вопросы плана “Какую оциональную переменную (константу)  можно передать такой-то функции, чтобы получилось то-то”. Причем функции супер-редкие, которые не так часто используются. Я считаю что программист - это всетаки не тот, кто вызубрил названия всех функций и аргументов к ним, а тот кто может адекватно проектировать ПО, и грамотно пользоваться мануалами при написании. Не понимаю к чему такое фанатичное стремление сделать из программиста живой мануал по языку.

Но в целом, спасибо Zend’у, Pearson Vue, и Interface.ru - благодаря вам, я - второй в Казахстане сертифицированный PHP Developer :)

P.S. Если кто планирует сдавать - пишите в каменты, я могу выложить набор книжек в PDF для этого дела.

Когда я ругал CodeIgniter за наличие в нем бесполезного scaffolding’а, я не брал во внимание что эта идея даст развитие таким проектам как CodeExtinguisher. А зря. Потому что CodeExtinguisher - инструмент для быстрой генерации административных панелей, что-то вроде скафолдинга, но уже с авторизацией, кучей плагинов и всего прочего. Очень удобно, скажу я вам, очень удобно. Особенно для всевозможных своих сайтов, управление которыми не рассчитано на дурака. Проект довольно некисло развивается, посмотрим что из этого выйдет.

О блоге

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

Photostream

    Good bye, Marry P. Face of fear Барсики 
  • Yerzhan: Как с Вами можно связатся, есть вопросы и предложения .. [...]
  • ALex: Это чтобы текст выделять можно было для перевода Прав [...]
  • ALex: pdf можно сконвертировать в doc при помощи pdf2doc с кряком :) [...]
  • ALex: Не забудьте поставить Dicter - удобная прога для перевода [...]
  • ALex: У меня есть, именно 2nd. Пиши на мыло ajskdl@mail.ru скину [...]