Локальное время в MySQL отличается от времени в PHP
Начинаю понимать почему многие разработчики забивают на тип DATETIME в MySQL и используют вместо него целочисленные поля:
$date = gmmktime(0,0,0,1,1,2010); //2010-01-01 00:00:00; DB::execute("insert into messages SET date_created=from_unixtime(?)",$date); $id = DB::getLastID(); $r = DB::execute("select date_created from messages where message_id=?",$id); print $r->fields[0]; //2010-01-01 03:00:00
все функции для работы с датой используют локальное время MySQL сервера, но так как они могут не совпадать с локальным временем в PHP то можно получить довольно интересные баги...
Оказывается для MySQL нужно выставлять зону отдельно.
DB::execute("SET time_zone='".Config::$mysql_timezone."'");
причем, строковые значения вида 'America/New_York' для зоны дают странные результаты - почемуто у меня получилось расхождение в 34 секунды c PHP, возможно связано с тем, что MySQL высчитывает даты с использованием leap seconds c в PHP просто прибавляет или вычитает часовую разницу, поэтому решил, что лучше использоватать числовые зоны, типа SET time_zone='-5:00'.
ColorPicker
Выложил на ztools.org компонент для выбора цвета, по моему, получилось неплохо...
Компонент представляет собой RGB палитру, наподобие той, что используется в Photoshop - на мой взгляд, так выбирать цвет удобнее всего, хотя, есть задумка сделать еще несколько оригинальных колорпикеров.
getElementsByTagName
Забавно, getElementsByTagName не только возвращает коллекцию элементов по имени тега, но и поддерживает эту коллекцию в актуальном состоянии.
Так, если я добавлю в документ еще один элемент с таким же именем, то количество элементов в коллекции созданной ранее изменится:
window.onload = function(){ var inputs = document.getElementsByTagName('input'); alert(inputs.length); var item = document.createElement('input'); document.body.appendChild(item); alert(inputs.length); }
Upd: действительно: The list is live, so changes to it internally or externally will cause the items they reference to be updated as well.
Маска, маска я тебя знаю
Понадобилось сделать картинку с неровными краями, причем картинка должна быть именно прозрачной, вариант сделать белый фон не прокатывает. Самым логичным было бы использовать наложение маски как это можно сделать скажем во флеше... но...
Почемуто в GD нет функций для работы с масками. Пришлось изобретать самим, и вот что получилось:
Так выглядит код маскирования:
$image = imagecreatefromgif('image.gif'); $mask = imagecreatefromgif('mask.gif'); $dest = imagecreatetruecolor(imagesx($image),imagesy($image)); imagemask($dest,$image,$mask); header('Content-type: image/jpeg'); imagepng($dest);
Код самой функции маскирования:
function imagemask($dest,$image,$mask){ $width = imagesx($image); $height = imagesy($image); $tc = imagecolorallocate($dest,0,0,0); imagecolortransparent($dest,$tc); for($i=0;$i<$width;$i++){ for($j=0;$j<$height;$j++){ $c = imagecolorat($image,$i,$j); $color = imagecolorsforindex($image,$c); $c = imagecolorat($mask,$i,$j); $mcolor = imagecolorsforindex($mask,$c); if (!($mcolor['red']==255 && $mcolor['green']==255 && $mcolor['blue']==255)){ $c = imagecolorallocate($dest,$color['red'],$color['green'],$color['blue']); imagesetpixel($dest,$i,$j,$c); } } } }
Правда расстраивает, что GD так и не научилась работать нормально с полупрозрачностью - если кто знает способ, расскажите плиз.