All streams
Search
Write a publication
Pull to refresh
218
0
Владимир Агафонкин @Mourner

User

Send message
Как говорится, всё новое — хорошо забытое старое. Практически все литературные сюжеты (как и композиции в музыке) повторяют в каком-то виде то, что было до этого, но это не мешает некоторым их них лежать в основе по-настоящему великих произведений.
А я недавно с таким же изумлением наткнулся на книгу Азимова «Популярная анатомия». :) Купил не раздумывая, хоть и никогда не интересовался подобным — теперь на очереди на прочтение. :)
Киев, Akson45. 14 мбит. Скорость отвечает заявленной, в целом никаких с ними проблем, если что — саппорт быстро реагирует. Очень доволен.
Скоро будет мегарелиз :) mapzen.cloudmade.com/
А что будет, если добавить white-space: nowrap?
Для меня JSLint тоже средство совершенно незаменимое, т.к. сам разрабатываю довольно непростой фреймворк (для карт). Особенно критичны две вещи: точки с запятыми (чтобы код не ломался после сборки различного рода компрессорами — сам пользуюсь рубишным packr, работающим по алгоритму Крокфорда) и отсутствие глобальных переменных (узкоспециализированный фреймворк не может себе такого позволить, чтобы избежать конфликтов с другими).
ты же напиши потом, работает или нет :)
Хочется добавить к вышесказанному, что самое глупое занятие у композитора — ждать вдохновения. По многолетнему опыту меня и многих других людей, занимающихся творчеством, вдохновение приходит во время процесса, а не перед ним. Так что заниматься нужно регулярно, не откладывать на моменты провидения, даже если сразу не всё получается.

Кстати, мы (украинская группа Обійми Дощу) недавно выпустили дебютный альбом — это грустный, по-осеннему лиричный прогрессив рок с элементами неоклассики (много живых струнных), можно скачать с сайта бесплатно. Можете послушать как пример того, к чему можно прийти, не имея музыкального образования — только энтузиазм и желание трудиться, не сдаваясь.
Нет, это действительно это дело привычки — тем, кто привык писать музыку в гитар про, в кубе это делать страшно неудобно.
Раз мы что-то удалили — оно должно взять, да удалиться и нигде больше не учитываться _при последующих событиях_, а не _предыдущих_. :) По-моему вполне логично.

А в твоём варианте действительно очень нужна оптимизация. :) А то тут получается целых три (!) вложенных друг в друга цикла (while, один for и другой в indexOf), при чём еще с кучей промежуточных вызовов функций, что вместе очень сильно должно тормозить по сравнению с одним циклом с прямыми обращениями к массиву без вызовов, как у меня.
Я об этом думал. :) На самом деле то, что листенер файрится даже после удаления, является ожидаемым поведением, т.к. листенер по определению должен исполниться сразу после файринга ивента только в том случае, если он на него подписан. Т.е. добавление/удаление листенера должно произойти до файра, чтобы он сработал/не сработал, а в этом случае оно идёт уже после файра. Плюс, природа ивентов в большинстве систем подразумевает, что изменение порядка выполнения листенеров в один момент времени не должно менять поведение системы.

А без удаления может быть такая ситуация: один листенер добавляет другой, который в свою очередь добавляет третий и т.д. Например, когда каждый клик по объекту определяет, как он должен будет себя вести при следующем клике (у меня такое было). В таком случае вместо ожидаемого поведения происходит бесконечный цикл и скрипт вешается.
Кстати, лучше в fireEvent сначала собирать все listener'ы в отдельный массив, а потом уже их в цикле выполнять (как у меня в примере). А то до того, как это сделал, сталкивался со разными багами в случае, если add/removeListener выполняется внутри другого listener'а.

Например, первый листенер сам себя удаляет, на следующей итерации цикла выполняется 2-й листенер в массиве listeners[type] (который раньше был 3-м), а предыдущий из-за удаления первого пропускается совсем.
Вообще практически все джаваскриптовые фреймворки способствуют применению такой функциональности. :) Custom events есть и применяются в jQuery, Prototype, YUI, Mootools, dojo, etc.
А вот моя реализация (из фреймворка для отображения карт):

CM.Event = {
	addListener: function(obj, type, fn, context) {
		obj._events = obj._events || {};
		obj._events[type] = obj._events[type] || [];
		obj._events[type].push({
			action: fn,
			context: context
		});
	},
	
	hasListeners: function(obj, type) {
		return !!(obj._events && obj._events[type]);
	},
	
	removeListener: function(obj, type, fn, context) {
		if (!this.hasListeners(obj, type)) { return; }
		
		for (var i = 0; i < obj._events[type].length; i++) {
			if ((obj._events[type][i].action == fn) && 
					(!context || (obj._events[type][i].context == context))) {
				obj._events[type] = obj._events[type].slice(0, i).concat(obj._events[type].slice(i + 1));
				return;
			}
		}
	}, 
	
	fire: function(obj, type) {
		if (!this.hasListeners(obj, type)) { return; }
		
		var args = Array.prototype.slice.call(arguments, 2),
			listeners = [], i;
		
		for (i = 0; i < obj._events[type].length; i++) {
			listeners[i] = obj._events[type][i];
		}
		
		for (i = 0; i < listeners.length; i++) {
			listeners[i].action.apply(listeners[i].context || obj, args);
		}
	}
};


Использовать так:

function handlerFn(arg1, arg2, ...) { ... }
...
CM.Event.addListener(exampleObj, 'exampleevent', handlerFn, this);
...
CM.Event.fire(exampleObj, 'exampleevent', arg1, arg2, ...);
Можно с помощью Dropbox играть и на работе и дома, не пользуясь онлайн-версиями. (Хотя играть на работе — удовольствие не для каждого :)
Нашёл всё-таки решение, которое работает и вроде бы удобно — Ctrl-вниз для SW, Alt-вниз для SE, для верха соответственно.
Поменял под виндой файл adom.kbd — не подхватывает почему-то, кейбиндинги старые остаются. :(
Это одна из моих самых любимых игр! Играл в нее с перерывами много лет, но так и не смог пройти (после того, как отказался жульничать с сейвами). :) Максимальным достижением был, кажется, хай элф прист где-то 25-30 уровня. Вот вы сейчас напомнили — пожалуй, попробую опять.
Вот когда перестаёшь этим пользоваться, игра становится НАМНОГО более захватывающей. Я тоже так делал, а потом перестал, и вам советую.

Information

Rating
Does not participate
Location
Киев, Киевская обл., Украина
Date of birth
Registered
Activity