Мар 28

Достаточно развёрнуто про новый функционал Django 1.4: http://blog.futurecolors.ru/search/label/Django%20Days

Теги:
Мар 28

«Clickjacking — относительно новый и не очень широко известный тип атак на веб-сайты. Его суть в том, что пользователь, совершая клик на специально сформированной странице злоумышленника, на самом деле кликает по ссылке на совершенно другом сайте. Это может быть использовано как для относительно безобидных накруток голосований (например, ретвитов или лайков), так и более разрушительных вещей, главное, чтобы для этого требовался щелчок мыши.»
Подробнее – на http://prophet.ru/2011/08/fighting-clickjacking/

Теги:
Мар 26

Отличная ошибка, на которую обычно просто «забивают», т. к. не понятно, где и что искать.

А ошибка вызвана тем, что в кастомном обработчике исключений происходит исключение, после чего php прерывает процесс с таким замечательным и информативным сообщением об ошибке.

В моём случае это было своё расширение для класса DateTime

	public function __construct( $Time = 'now', DateTimeZone $Timezone = null )
	{

		// PHP 5.3.3 имеет этот баг:
		// @link https://bugs.php.net/bug.php?id=52063
		// поэтому пишем странное:
		if ( ! empty( $Timezone ) ) {
			parent::__construct( $Time, $Timezone );
		}
		else {
			parent::__construct( $Time );
		}

	// ещё раз вызываем явно setTimezone, чтобы обойти багу с timestamp - @link http://www.php.net/manual/en/datetime.construct.php#97724
		if ( empty( $Timezone ) ) {
			$this->setTimezone( new DateTimeZone( 'Europe/Moscow' ) );
		}
	}

Если не написать тот странный код, то происходило прерывание php-процесса с ошибкой
PHP Fatal error: Exception thrown without a stack frame in Unknown on line 0. У нас такое происходило только на одном из серверов на продакшн, который админы никак не могут обновить до нормальной версии php.

Вот подробное описание, почему так происходит: http://www.php.net/manual/en/function.set-exception-handler.php#68712

Теги:
Мар 21

Читал-читал про инверсию управления (Inversion of Control), всякие Pico и Phemto.
Continue reading »

Теги:
Мар 21

Удобный css-фреймворк.
Позиционирует себя как «Simple and flexible HTML, CSS, and Javascript for popular user interface components and interactions.»
http://twitter.github.com/bootstrap/components.html

Теги:
Мар 14

Захотелось сделать более правильную работу с триггерением/навешиванием обработчиков на события, чем это реализовано в jquery-ui.
При этом сам функционал надоело копировать из виджета в виджет.
В общем, вот простой добавить методы к своим виджетам:


(function( $ )
{
	"use strict";
/**
 * расширение базового функционала jquery-ui
 */
	$.widget( "my.my_extension", {
		_triggerSmart: function( EventName, Data )
		{
			var me = this;
			var $me = $( me.element );

			$me.trigger( EventName + '.' + me.widgetName, Data );
			return me;
		},
		_bindSmart: function( EventName, Handler )
		{
			var me = this;
			var $me = $( me.element );

		// боремся с повторным навешиванием обработчика
			var events = $.data( $me.get( 0 ), 'events' );
			var filteredEvents = [];
			if ( EventName in events )
			{
				filteredEvents = $.grep( events[EventName], function( Event ) {
					return Event.type == EventName && Event.namespace == me.widgetName;
				} );
			}
			if ( ! filteredEvents.length ) {
				$me.bind( EventName + '.' + me.widgetName, Handler );
			}
			return me;
		}
	} );
}( jQuery ));

Потом для каждого виджета нужно будет указать опциональный второй параметр

$.widget( "my.fast_search", $.my.my_extension,
	{
		options:
		{
			...

Внимание нужно обратить на второй параметр $.my.my_extension, который в принципе предназначен для расширения функционала работающего виджета, но отлично работает и для того, чтобы унаследовать некие базовые методы в виджеты.

Сначала начал делать через

	$.extend( $.widget.prototype, {
		...
	} );

но понял, что выигрыш в производительности будет слишком условным (из-за того, что при способе с прототипом методы копируются в память один раз, а не для каждого виджета), а простота реализованного способа – сильный профит.

Теги:
Мар 11

Если нужно поставить старый firefox, для этого нужно:

  1. проинсталлировать старую версию в другую папку
  2. выполнить в командной строке «C:\Program Files (x86)\Mozilla Firefox 3.6\firefox.exe» -Profilemanager (путь к старой версии)
  3. в менеджере создать новый профиль (firefox-3.6) и выбрать его для использования
  4. в ярлыке прописать «C:\Program Files (x86)\Mozilla Firefox 3.6\firefox.exe» -P “Firefox-3.6″ -no-remote

http://www.htmlcenter.com/blog/multiple-firefox-installs/

Теги:
Мар 11

https://www.alwaysdata.com/plans/shared/

Языки: PHP, Python, Ruby, Perl, Java, Lua, OCaml, Erlang; фреймворки: Джанго, Рельсы и symfony (PHP).
Сам не пробовал, но слышал.
Минусы – под код дают целых 10 Мб дискового пространства и гигабайт трафика в месяц.

Теги:
Мар 11

Почему использовать localStorage вредно: http://hacks.mozilla.org/2012/03/there-is-no-simple-solution-for-local-storage/.
Ответ, почему можно его использовать: http://www.nczonline.net/blog/2012/03/07/in-defense-of-localstorage/.
В общем мнения разделились, запасаемся попкорном.

Мар 11

В Windows 7 в командной строке

mklink /J "C:\Program Files (x86)\Steam\steamapps" "D:\Games\steamapps"

Кстати так можно играть в игры через steam, если мало места на диске C:\ ;) .

Теги:
preload preload preload