2010-01-14

Локальное время в 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'.

 

Оставить комментарий

 
  2010-01-05

ColorPicker

Выложил на ztools.org компонент для выбора цвета, по моему, получилось неплохо...

Компонент представляет собой RGB палитру, наподобие той, что используется в Photoshop - на мой взгляд, так выбирать цвет удобнее всего, хотя, есть задумка сделать еще несколько оригинальных колорпикеров.

 

Оставить комментарий

 
  2009-12-18

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.

 

 

Оставить комментарий

 
  2009-12-04

Маска, маска я тебя знаю

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

Почемуто в 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 так и не научилась работать нормально с полупрозрачностью - если кто знает способ, расскажите плиз.

 

Коментариев: 1

 
  2009-11-18

Занятный фокус с JS

За что я люблю JS это за то что на нем можно реализовать некоторые вещи совершенно нетривиальным способом. Например такая задача: Есть IFRAME который создается динамически, нужно привесить событие onload на объект window внутри этого IFRAME. Сразу после создания свойство contentWindow равно нулю, поэтому непосредственно после создания доступа к нему нет. Оно станет доступно через некоторое время. Логичным будет проверять на ноль свойство каждые сто миллисекунд пока оно не будет чему нибудь равно:

var onloadfunc = function(){
    alert('loaded!!!');
};
        
(function(){
    if (!iframe.contentWindow){
         setTimeout(arguments.callee,100);
         return;
    }
    iframe.contentWindow.onload = onloadfunc;
})();

В приведенном примере анонимная функция вызывает саму себя через каждые 100 миллисекунд. Интересно что когда это писал - забыл поставить точку с запятой в }; - это привело к интересной штуке - калбак стал вызываться на этапе инициализации - т.е. скобки имеют наивысший приоритет даже если между ними стоит перенос строки.

 

Коментариев: 1

 
  2009-10-26

говорят SVN это дырка...

На Хабрахабре интересная статейка про то как люди часто пренебрегают элементарными средствами безопастности, выставляя служебные папочки .svn на всеобщее оборзение.

http://habrahabr.ru/blogs/infosecurity/70330/

Upd:
чтобы запретить это безобразие просто добавьте в .htaccess или в httpd.conf:

<IfModule mod_rewrite.c>
  RewriteRule ^(.*/)?\.svn/ - [F,L]
  ErrorDocument 403 "Access Forbidden"
</IfModule>
 

Причем как то странно на одном сервере это не сработало, сработало вот это:

<DirectoryMatch "^/.*/(\.svn|CVS)/">
  Order deny,allow
  Deny from all 
</DirectoryMatch>
 

Коментариев: 2

 
  2009-08-21

Закачака файлов AJAX

Нашел занимательный пример по закачке файлов посредством AJAX. Решение, оказывается, простое ну просто до безобразия - у формы с файлом ставится target с именем невидимого фрейма, за счет этого форма с файлом не перегружается а перегружается этот самый невидимый фрейм. Гениально!

 

Оставить комментарий

 
  2009-08-18

Несколько полезных JS функций

Обнаружил что в квирк моде все браузеры определяют размер документа не так как в режиме соответствия стандартам, более того делают они это как бог на душу положит, поэтому сделал несколько полезных функций для того чтобы как то получить во всех браузерах в обоих режимах единообразные результаты. Тестировано в IE6, IE7, FF, Chrome, Opera

function getDocumentHeight(){
    var de = document.body.parentNode;
    var db = document.body;
    return ((db.clientHeight>de.clientHeight)?db.clientHeight:de.clientHeight);
}

function getDocumentWidth(){
    var de = document.body.parentNode;
    var db = document.body;
    return ((db.clientWidth>de.clientWidth)?db.clientWidth:de.clientWidth);
}

function getScreenHeight(){
    var de = document.body.parentNode;
    var db = document.body;
    if (window.opera) {
	return db.clientHeight;    	
    }
    if (document.compatMode=='CSS1Compat'){
	return de.clientHeight;    	
    }
    else {
	return db.clientHeight;
    }
}

function getScreenWidth(){
    var de = document.body.parentNode;
    var db = document.body;
    if(window.opera){
	return db.clientWidth;
    }
    if (document.compatMode=='CSS1Compat'){
	return de.clientWidth;
    }
    else {
    	return db.clientWidth;
    }
}

function getScrollTop(){
    return document.documentElement.scrollTop || document.body.scrollTop;
}

function getScrollLeft(){
    return document.documentElement.scrollLeft || document.body.scrollLeft;
}

 

Оставить комментарий

 
  2009-06-05

Как получить список координат из Google Maps

Здесь можно найти исходники и примеры на эту тему.

 

Оставить комментарий

 
  2009-03-20

Прелоадер-Генератор

Bomfunk выложил сабж а я его немного отрихтовал - так стало гораздо симпатичнее :)

 

Коментариев: 6