ДР


Символ \u01f382

На минувших выходных у меня случился день рожденья. Но это не важно, ведь день рожденья также случился и у сайта Unicode-Table.

Подробности в блоге дизайнера Асанова.

Если вы молодая девочка, то сайт Unicode-Table лучший источник сердечек и других символов для вконтактика.

Если же вы солидная бизнес-вумен, то сайт Unicode-Table лучшее место для размещения рекламы.

Не пропустите!

JavaScript: пользовательские исключения

В JavaScript есть обработка исключений. try-catch-finally, throw, всё как у взрослых. Большинство программистов, правда, ими не пользуется, но не в этом суть.

И вот мы пишем, допустим, библиотеку и хотим, чтобы её функции в случае чего бросали определённые исключения. Язык позволяет нам здесь бросать что угодно, например, строку: throw "Ой, ошибка, ошибка!";.

Но, это не наш путь. Есть предопределённые типы ошибок, унаследованные от Error и есть стандарт, который говорит нам об объекте с полями name и message.

MDN показывает нам, как сделать свой «класс» исключений, унаследованный от Error:

// Create a new object, that prototypally inherits from the Error constructor.
function MyError(message) {
    this.name = "MyError";
    this.message = message || "Default Message";
}
MyError.prototype = new Error();
MyError.prototype.constructor = MyError;

Мозиловцы правда здесь согрешили и использовали для создания прототипа рабочий конструктор Error. Сделаем по правильному:
Остальной текст под катом

Вторничнее утро философствования

Ни одному автору, к сожалению, не дано решать, что из того, что он сделает понравится публике, а что нет. А может к счастью, а не к сожалению.

Вот я, например, уже здесь сотню статеек накатал, некоторые даже, на мой взгляд, не слишком глупые были. А единственное, что хоть как-то в народ пошло, это стёб про форумы.

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

А глупой публике подавай только шерлокхолмса. Как он нервничал, бедный. Он тут такие серьёзные труды пишет, а им эту пошлятину подавай. Сколько раз он этого Холмса убивал, а ему тут же со всей Англии барышни пишут и в письмах ноют. Так и остался на всю жизнь автором одного героя. До сих пор, наверное, в земле ворочается.

Вот и гуглята теперь не слишком умным людям стараются объяснить положение дел. RSS — мёртвая технология. Кому она нужна, когда есть прекрасный гуглоплюс? Мы вообще этот ридер делали, чисто, поржать.

А люди не понимают, насколько прекрасен гуглоплюс. Глупые, глупые люди. Тёмное страшное время…

Javascript: объекты vs структуры

Как мы рассмотрели в прошлых статьях, система типов в JavaScript не так, чтобы уж очень стройная.

И есть ещё один теоретический нюанс. Object в JS, по-сути, отвечает за две совершенно различные сущности.

С одной стороны это объект из ООП: отдельная индивидуальность со своим поведением и интерфейсом.

С другой: хранилище структурированных данных. Тоже, что и struct в Си, Dict в Питоне, Hash в Перле или ассоциативные массивы в PHP.
В питоне Dict, конечно, тоже объект, но там мы чётко можем разобрать — это словарь а не что-то иное. В JS разобрать это сложнее.
Остальной текст под катом

JavaScript: типы, классы и фреймы

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

Рассмотрим ещё один аспект: фреймы. Из фрейма во фрейм можно передавать данные.

Например, у нас есть функция, которая обрабатывает массив немного по другому, чем объект:

function func(value) {
    if (value instanceof Array) {
        // массив
    } else {
        // объект
    }
}

И на странице есть iframe, в котором следующее:

window.parent.func([1, 2, 3]);

Это будет работать некорректно. Так как мы сравниваем значение с нашим Array из нашего основного окна. А значение создано во фрейме, в котором свой window и свой window.Array и именно от него производится этот массив.
Остальной текст под катом

Function Expression и ебучий осёл

В JavaScript, как известно, есть два способа объявить функцию.

/* Function Declaration. Функция сразу определяется в локальном контексте под именем func */
function func() {
 
}

и

/* Function Expression.  */
var func; // func просто переменная. Изначально в ней, как обычно, undefined.
 
func = (function () {}); // В определённый момент в качестве значения ей присваивается объект функции.

FE ещё называют анонимной функцией.

И есть ещё один подвид Function Expression. Именованное (Named) Function Expression:

var func;
 
func = (function fufunc() { /* ... */ });

Анонимная неанонимная функция :).

В нашем локальном контексте по прежнему есть переменная func.
Но в контексте вызываемой функции также появляется её «имя» fufunc.
Остальной текст под катом

WordPress: похожие посты (хардкор-вариант)

Задача: в wordpress’е после статьи выводить список «похожие статьи».

Если у двух статей совпадает один из тегов или категория, то это похожие статьи. Чем больше тегов совпадает, тем сильнее похожие. Вывести нужно пяток наиболее похожих. Если у двух статей одна «релевантность», то выше выводить более свежую.

По запросу «wordpress similar posts» можно найти множество плагинов данной тематики. У них у всех отличный код, подробная документация и богатый набор настроек. Единственный минус: вместо похожих постов они выводят какую-то рандомную хероту.
Остальной текст под катом

[без названия]

Есть вот, допустим, компания-хостер. И предоставляет она услуги виртуального хостинга.
И всё с первого взгляда у них хорошо. И сервис отличный и саппорт отзывчивый.
И даже дают ssh-доступ к аккаунту.
И на сайте приведены подробные руководства, как, например, простому веб-мастеру настроить себе cron, через crontab.

И тут простой веб-мастер расслабляется и попадается в коварную ловушку. Потому, что редактор по умолчанию у них на сервере — VI.

Господи, кто рожает таких людей, которые подсовывают простым людям VI? Почему у них полностью атрофировано понятие о добре и зле? Как они могут спокойно спать и завтракать по утрам?

JavaScript: вызов конструктора с произвольным числом аргументов

Есть у нас, предположим, функция и есть у нас массив произвольного количества аргументов для неё. Как нам её вызвать? Очень просто:

function f(a, b, c) {
    // ...
}
var args = [1, 2, 3];
 
f.apply(f, args);

Здорово.
Следующая задача: у нас есть функция-конструктор и массив аргументов для неё. Как нам использовать этот массив совместно с оператором new? Может new f.apply(f, args)? Хрен там, здесь new будет пытаться использовать в качестве конструктора результат от f.apply().
Остальной текст под катом

Путь извращенца: Singleton на JavaScript

Понадобился нам в нашем js-сценарии, допустим, Singleton. Ну, мы берём и делаем, как все взрослые дяди:

/**
 * @class MyClass
 * @property {String} x
 * @property {String} y
 */
function MyClass() {
    this.x = "x";
    this.y = "y";
}
MyClass.prototype = {/* ... */};
 
/**
 * Get instance of singleton
 *
 * @static
 * @return {MyClass}
 */
MyClass.getInstance = function () {
    if (!this.instance) {
        this.instance = new this();
    }
    return this.instance;
};
 
var instance1 = MyClass.getInstance(),
    instance2 = MyClass.getInstance();
 
instance1 == instance2; // true

Но, ведь, JavaScript идеальный язык для того, чтобы сделать какое-нибудь извращение. Грех такой шанс упустить.
Остальной текст под катом

По страницам: 123456789101112131415