85 posts tagged

по-русски

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

Later Ctrl + ↑

С кодом будь строг. Настройка jshint

Сейчас использую, и лучшего не видел jshint. До него я работал с js2-mode для emacs и его более продвинутой версией, с jshint от дядюшки Крокфорда. jshint использую в качестве плагина к sublimetext2. Чтобы начать пользоваться им
  • надо установить node.js
  • через package control установить SublimeLinter
  • покрутить настройки до удовлетворяющего уровня
Кстати, этот инструмент доступен для ряда других редакторов (notepad++, eclipse).
Остановлюсь на настройках и на случаях, которые они покрывают. Мой файл настроек можно взять тут. Что такое .jshintrc можно прочитать в документации

curly : true

Заставляет ставить фигурные скобки даже тогда, когда они не обязательны. С одной стороны улучшается читаемость кода, с другой, при простейшей обфускации код продолжает корректно работать.
if (ready())
	onready();
else
	on_not_ready();
// VS
if (ready()) {
	onready();
} else {
	on_not_ready();
}

eqeqeq : true

Контролирует использование строгого сравнения. Выигрыш получается не только в производительности (он мизерный на самом деле), а в чуть большей прозрачности кода (не надо задумываться о том, какого типа данные хранятся в переменных). Подробнее про автоматическое приведение типов при нестрогом сравнении.
['1'] == 1;     // true
['1'] === 1;    // false
month === '7';  // очевидно, что month содержит строку

forin : true

Ошибочным считает перебор свойств объекта без проверки hasOwnProperty (этого метода нет в ie7). Особенно полезно создателям 3-d party библиотек или встраиваемых скриптов. Подобная проверка ограничит код от удовлетворенных порывов к monkey patching.

immed : true

Обязывает оборачивать моментально вызываемые функции в скобки. Таким образом читающему становится ясно, что фишка в вызове функции, а не в ее определении (при этом ясно как читая с начала, так и с конца определения).

latedef : true

Обращает внимание на вызов функций перед их определением. Хотя это и естественная практика (так как определением функций происходит на этапе чтения кода, и функции уже объявлены на этапе интерпретации), для не знающего тонкостей ecma, подобная запись будет сюрпризом.

newcap : true

Стимулирует использование заглавных первых букв в именах конструкторов.

noarg : true


Негодует при использовании arguments.calle, arguments.calle.caller (см. strict mode).

noempty : true

Не приемлет использование пустых блоков кода. Чаще всего такие конструкции связаны с ошибкой или опиской.
if (document) {} // вероятнее всего описка

plusplus : true

Поощряет использование += и -= вместо ++ и --. Запись чуть длиннее, зато понятно что происходит и в каком порядке.

undef : true

Присвоение неопределенной переменной выдаст ошибку. В нестрогом режиме в таком случае создает глобальная переменная (см. strict mode).

asi : false

Принуждает к расстановке точек с запятой. Стандарт говорит, что точку с запятой ставить не обязательно, интерпретатор самостоятельно их расставит. Правда сделать это он может неоднозначно. Код ниже приведет к ошибке из-за отсутствия точки с запятой после объявления объекта. Подобную неожиданность можно встретить при конкатенации файлов, при длинном объявлении объекта или при большом расстоянии между объявлением объекта и вызовом функции (в виде комментария, например). Одно из решений — всегда ставить точку с запятой перед вызовом анонимной функции.
var obj = {
	prop : 'val'
}

(function () {
	// полезная функция
}()); // ошибка

funcscope : false

Возбраняет использование функций и переменных, объявленных в лексических областях видимости. Для новичка не прозрачно то, что все вар-ы создаются на этапе чтения скрипта. К тому-же на сегодняшний момент код ниже генерирует ошибку в фаерфоксе.
if (true) {
	function a () {}
} else {
	function b () {}
}
b();

Теперь у вас в руках остро наточенный инструмент, который позволит не задумываться над синтаксисом, а сконцентрироваться на логике.
2012   по-русски

С кодом будь строг. Интерпретатор

Строгий контроль написания кода уменьшает количество потенциальных ошибок. javascript допускает многие вольности, при том такие, которые могут породить трудно обнаруживаемые ошибки. Тут на помощь приходят редакторы и интерпретаторы. На уровне редакторов есть несколько инструментов, статического анализа кода, а со стороны браузеров доступен строгий режим выполнения javascrip кода.

Use strict

Ниже — примеры того, где строгий режим генерирует ошибки (полное описание отличий строгого режима). Надо отметить, что генерация ошибок происходит на этапе чтения исходного файла. Это значит, что функции, объявленные в нестрогой области видимости будут без проблем вызваны из «строгих функций». Так же не рекомендуется использовать строгий режим глобально, потому что вероятнее всего он сломает 3-d party код.

Нельзя присвоить значение необъявленной переменной. Код ниже в строгом режиме вместо создания глобальной переменной выдаст ошибку.
// Нестрогое поведение
function f () {
	a = 10;
}
f();
// Неожиданная глобальная переменная
console.log(a); // 10


// Строгое поведение
function f () {
	'use strict';
	a = 10;
}
f(); // ошибка

Запрещено дублирование имен свойств объекта.
(function () {
	var obj = {
		prop : true,
		prop : false
	}

	console.warn(obj); // {prop:false}
}());

(function () {
	'use strict';

	var obj = {
		prop : true,
		prop : false
	}

	console.warn(obj); // error
}());

Объект arguments — неизменяемый. Проблема заключается, в том, что изменяя arguments, изменение коснутся и аргументов, связанных с переменными, и самое неприкольное то, что примитивные значения тоже изменятся.
function f (a, b) {
	arguments[0] = 10;
	console.log(a, b);
}

f(1, 99); // 10, 99

Запрещено использование arguments.callee, и arguments.callee.caller. Говорят, что из-за наличия такого кода, интерпретатор не может оптимизировать код. Вместо этих конструкций рекоммендуется использовать named function expression.
(function waiter () {
	if (condition()) {
		action();
	} else {
		setTimeout(waiter, 50); // используем имя вместо arguments.callee
	}
}());
2012   по-русски   разработка

Ленивые вычисления в javascript

Ленивые, отложенные вычисления — такой подоход, когда значения вычисляются только тогда, когда в них возникает потребность, при этом есть возможность не вычислять это значение повторно при последующих вызовах функции. В javascript этот подход можно реализовать с помощью замыканий и переопределения функции изнутри самой себя.
function func_name () {
	var variable_foo,
		variable_bar;

	variable_foo = get_foo();
	variable_bar = get_bar();
	func_name = function () {
		return variable_foo + variable_bar;
	};
	return func_name.apply(this, arguments);
}
Фишка заключается в том, что значения variable_foo и variable_bar будут вычислены только при первом вызове функции. При этом-же вызове функция переопределит себя, захватывая scope с вычисленными переменными и себя-же родимую вызовет (при этом корректно сохраняя this, возвращаемое значение, а так же переданные аргументы).

Этот подход сработает и для методов:
var obj;

obj = {};
obj.method = function () {
	var variable_foo,
		variable_bar;

	variable_foo = get_foo();
	variable_bar = get_bar();
	this.method = function () {
		return variable_foo + variable_bar;
	};
	return this.method.apply(this, arguments);
}
Такие манипуляции дадут выгоду по производительности в случае, если метод или функция может быть не вызвана. В этом случае выигрыш составляет время вычисления кешируемых переменных. Или же случаи, когда функция вызывается два и более раз. В этом случае выигрыш составит время вычислений переменных помноженное на количество вызовов.

Из минусов: зависимость от имени функции или метода. Слишком просто будет допустить ошибку. Во избежание залепил сниппет для sublimetext2, который расскрывается в следующее
// srv
function_name = function () {

};
return function_name.apply(this, arguments);
(этот сниппет можно найти на gihub).
2012   по-русски   разработка

Что почитать

«Апгрейд обезьяны» А. Никонов

Одна из лучших научно-популярных книг, что я читал. Небрежным тоном и с презрением к читающим (оно присутствует на первых страницах) Никонов описывает модели, которыми оперируют физики для описания вселенной. При этом экстраполирует эти модели на эволюцию и общественные отношения.

Если до прочтения я имел представление, что привязанность и эмоциональный взрыв, про который сегодня предостаточно пишут-поют-сочиняют, является химической реакцией в мозгу, то в книге рассказывается причины и механизм появления этого явления.

Никонов описал про химическую эволюцию и про переход от белковых структур к жизни. Этот момент для меня всегда был белым пятном в эволюции живого, так как во всех книгах описывался «первичный бульон» из которого появилась жизнь. И ни слова про то что именно происходило в нем.

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

Как автор и человек он мне очень импонирует: подводит аргументацию под свои слова, ссылается на научные работы, чертовски прагматичен и не стесняется материться.
В общем, если вас интересует что напридумали ученые в последнее время и каково состояние научного мировоззрения на сегодняшний день — приобретайте эту книгу.
Кстати у Никонова действует жежешка.

«Вы, конечно, шутите, мистер Фейнман» Ричард Ф.Фейнман

Автобиография чертовски интересного человека: мастера по починке радиоприемников и компьютеров, барабанщика, художника, взломщика сейфов и замков, физика-теоретика, нобелевского лауреата, человека, приложившего руку к созданию атомной бомбы. Эту книгу стоит прочитать только для того, чтобы оценить то, с какой искренностью Фейнман описывает свои переживания в той или иной ситуации. С одной стороны. И с другой с каким образом он подходит к решению проблем. Этот подход здравого разума и разностороннего рассмотрения задачи.
Как снять девушку в баре, получить доллар за патент атомной подводной лодки, выступить на мировом уровне с балетом: все это расскажет профессор Ричард Ф.Фейнман. А пока он расскажет почему поезда не сходят с рельс.
Кстати на ютубе есть несколько роликов, переведенных (спасибо большое) http://freetonik.com/
2012   по-русски   что почитать

Javascript и common lisp синонимы

Мой второй подход к снаряду (practical common lisp). Синонимические конструкции из javascript и common lisp для самоободрения.
var o = (function () {
    var count = 0;

    return [function () {
        return count += 1;
    }, function () {
        return count -= 1;
    }, function () {
        return count;
    }];
}());
(defparameter *o* (let ((count 0))
					(list 
					 #'(lambda () (incf count))
					 #'(lambda () (decf count))
					 #'(lambda () count))))
2012   по-русски   разработка

Асинхронный итератор

При работе с googlemaps столкнулся с проблемой, когда большое количество маршрутов (более 20) при одновременной отрисовке принеприятно тормозило интерфейс. При это последний firefox тормозил сильнее, чем internet explorer. Для обхода проблемы решил, что если единовременно надо отрисовать больше, чем 15 маршрутов, я буду рисовать их с периодичностью в 50 мс. То есть между вызовами функций отрисовки будет проходит не менее 50мс (gist).
function iterate_async (arr, callback, timeout) {
	var index;

	index = 0;
	(function run () {
		if (index < arr.length) {
			setTimeout(function () {
				callback.call(arr, arr[index], index, arr);
				index += 1;
				run();
			}, timeout || 50);
		}
	}());
}
Из нюансов:
  • первый вызов синхронный
  • this в обработчике ссылается на обрабатываемый массив
  • обработчик получает аргументами элемент массива, индекс обрабатываемого элемента, сам обрабатываемый массив
  • если не указано явное время между вызовами обработчиков, то оно устанавливается в 50мс
И пример вывода элементов списка с вызовом обработчика через каждые 99мс:
var arr = ['masha','nadya', 'elena'];
iterate_async(arr, function (el, index, arr) {
    console.log(el + ' is #' + (index + 1));
}, 500);
2012   по-русски   разработка

javascript сниппеты для sublimetext2

Дошли руки оформить коллекцию javascript сниппетов для sublimetext2. Как человеку, работающему с кодом, мне хочется как можно меньше набирать текст, меньше тратить телодвижений на превращение мысли в код.

Установка вручную

  1. скачать архив с github
  2. распаковать в папку с package-ами (в редакторе: Preferences – Browse Packages...)

Установка через package control

  1. В sublimetext2 выполнить в консоли “Package Control: Add Repository”
  2. В поле ввода вставить урл https://github.com/podgorniy/js-snippets-st2
  3. Теперь сниппеты можно устанавливать как любой другой плагин из Package Control (в консоли Package Control: Install Package – js-snippets-st2)
Преимущество последнего: обновление сниппетов, автоматически при обновлении репозитория.

Субъективные переживания

Свойства сниппетов для sublimetext2, что меня порадовали:
  • сниппет появляется в автокомплите
  • сниппет доступен их командной строки (где его можно искать по описанию)
  • сниппет не статический, доступно нечто вроде ветвления (об это ниже)
Про “ветвление” (уверен, что этому явлению есть научное название). Стандартный сниппет get разворачивается в нечто следующее: getElementsByTagName(‘‘) при этом символ “T” выделен. Если начать набирать I, то развертка сниппета превратится в getElementById(‘‘). Это революция: зачем делать два отдельных сниппета для таких схожих методов, если можно обойтись одним? Попробуйте, с таким подходом код становится набирать на 55% приятнее и на 50% быстрее. Я дал себе обещание научиться писать подобные сниппеты и сдержал его. Позже расширил коллекцию частоупотребляемыми методами.

Tabstops указаны символом | (последовательность не указана, определяйте ее экспериментальным путем)
Однословные
  • a – arguments
  • de – debugger
  • d – document
  • l – location
  • p – prototype
  • w – window
  • q – querySelectorAll(‘‘)
Логгирование
  • cl – console.log();
  • cw – console.warn();
  • ci – console.info();
  • ct – console.timeStamp(‘‘);
Анонимщина
// sif
;(function () {
	|
}());

//sifs
;(function () {
	'use strict';

	|
}());

Теперь хитрые (с ветвлением, текстом по умолчанию и кучей tabstops)
Хитрые
  • set – setTimeout(function () {}, 50); по умолчанию стоит setTimeut, но достаточно начать набирать I, как сниппет превратится в setInerval (при этом есть возможность изменить время таймаута, вместо анонимной функции указать именованную. Последняя остановка внутри анонимной функции)
  • clr – clearTimeout(); так же позволяет очищать интервалы
//for
for (i = 0; i < arr.length; i += 1) {
	arr[i]
}
Цикл (стандартные ужасны) можно подменять имя массива, имя счетчика. Подразумевается, что счетчик уже объявлен (да, я объявляю переменные в начале функции)
  • ’ – ’ + + ’ крайне удобная вещь для быстрой вставки значений в строки.
2012   по-русски   разработка
Earlier Ctrl + ↓