2009 / 03 / 17

Перестановки

Дорогие мои марсиане. Сограждане. Я принял решение, и оно далось мне нелегко.

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

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

Во-вторых, от многих из вас до меня доходят сигналы, что было бы неплохо как-то разделить статьи технического плана и посты “про остальное”. И слова ваши доходили до моего сердца и наконец нашли в нем отклик.

В-третьих, меня уже давно не устраивает низкая посещаемость - почти все программисты (и особенно java/javascript программисты) общаются на англоязычных ресурсах. К слову сказать, все средства для ведения мультиязычного блога на wordpress откровенно убоги. Это, так сказать, еще одно “фи” в сторону wrordpress’a.

В общем, исходя из всего вышенаписанного, я думаю, что правильнее всего будет сделать следующее:

  • Разделить блог на две части: лытдыбр (под которую уже выделен отдельный блог по адресу http://ulizko.name) и т.н. "технические статьи", которые останутся по этому адресу.
  • Весь блог будет вестись на английском языке. Тому есть две причины: первая это та, что англоговорящих программистов (т.е. людей, которым интересен этот контент) в разы больше, чем русскоговорящих, а значит, я смогу делиться мыслями с гораздо большим количеством народа, что, откровенно говоря, меня заводит. И вторая - я смогу поднять свой уровень английского языка, что также лишним не будет. Будут ли доступны в том или ином виде тексты статей на русском - пока не знаю, сообщу дополнительно.
  • Будет проведен редизайн блога. Просто так, потому что мне того хочется.
  • Блог будет переведен на другую, самописную платформу. Как говорится, сделанное своими руками колесо - самое круглое колесо в мире! Опять же, есть несколько интересных задумок, которые очень и очень сложно реализовать на базе wordpress'a.

Что же требуется от вас, читателей?

  • Если вы читаете блог ради технических статей - стэй, как говорится, тюнд. Между постами будет нехилый перерыв, думаю, с месяц, но потом все наладится. Правда, будет уже на английском языке. И rss будет тот же.
  • А вот если вам нравятся все остальные посты, то вам нужно подписываться на rss от ulizko.name. Напоминаю, все посты, не относящиеся к IT, будут перенесены в http://ulizko.name.

2009 / 03 / 16

Невпопад

Хочу в отпуск. Так хочу, что меня все раздражает.

GC в ruby в сто раз примитивнее того, что используется в jvm. Ц-ц-ц.

И еще меня начинает раздражать “мусорность” javascript. Я имею ввиду, что, в целом, многие ништяки из ФЯП можно реализовать и в javascript, но на java-подобный синтакс такие штуки не очень хорошо ложатся:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// пусть ArrayUtils - это специальная утилита для работы с массивами, 
// реализующая for…each, map/reduce для всех браузеров, включая ie6. 
// Что-то наподобие YUI.Array
var A = window.ArrayUtils = {
    map : (Array.prototype.map) ?
        function (a, fn, c) {
            return a.map(fn, c || window);
        } :
        function (a, fn, c) {
            var result = [], i = a.length;
            while(i--) {
                result[i] = fn.call(c || window, a[i]);
            }
            return result;
        },
    filter : (Array.prototype.filter) ?
        function (a, fn, c) {
            return a.filter(fn, c || window);
        } :
        function (a, func, c) {
            var result = [], i = a.length;
            while(i--) {
                if (i in a && fn.call(c || window, a[i], i, a)) result.push(a[i]);
            }
            return result;
        }
};

// получим новый массив, получаемый из исходного путем умножения каждого элемента на два.
// уже немножко "weird", не так ли?
var data = [1, 2, 3, 4];
A.map(data, function (item) { return item * 2; }); // 2, 4, 6, 8

// а теперь пример повеселее:
var persons = [
	{
		name : 'John', 
		lastName : 'Doe',
		address : 'California, Los Angeles'
	},
	{
		name : 'Ivan',
		lastName : 'Ivanov',
		address : 'Moscow'
	},
	{
		name : 'Abraham',
		lastName : 'Smith',
		address : 'California, San Francisco'
	}
];

// Получим массив, состоящий только из полных имен пользователей, проживающих в калифорнии
var townRegex = /california/i;
A.map(A.filter(persons, function (person) {
    return townRegex.test(person.address);
}), function (person) {
    return person.name + ' ' + person.lastName;
}); // John Doe, Abraham Smith

Чрезвычайно избыточный и непонятный с непривычки код, особенно в сравнении с аналогичным в ruby или python.

2009 / 03 / 15

manual written if

Как многие из вас в курсе, на днях на хабре промелькнул топик «Как я гонял на клаве», от хабраюзера jahson. Примечателен этот топик вовсе не своим скриптом, а тем, что дал старт достаточно неприятной сваре, в ходе которой владелец и автор «Клавогонок», известный на хабре как artch, повел себя, на мой взгляд, не вполне адекватно. Это не говоря уж о том, что решать такие вопросы принято в личке, не привлекая общественное мнение (которое, к слову, катком прошлось по карме artch).

По мере того, как я читал обсуждение, мне все больше становилось жаль jahson’a, по мере сил отбивавшегося от нападок автора и присных. И в процессе этого сочуствования решил я поднять jahson’у карму, зайдя в его личку. Где увидел не только то, что он не особо нуждается в помощи, но и то, что он член «Российского крыла Web Standards Group».

Тут надо сделать отступление — я, вообще говоря, не знал о существовании такой организации, точнее, о существовании ее российского крыла, и немедленно заинтересовался. Набрав в гугле известное сочетание слов, я попал на страничку «Веб-стандарты — WSG-Россия». Интересно, можно ли еще попасть в ряды, или лавочка уже прикрыта? Судя по тому, что последние встречи проводились в 2007 году, то уже нет, но, если кто-то владеет более актуальной информацией, призываю его поделиться.

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

Отдельно хотелось бы упомянуть Дмитрия Барановского, который, к слову, присутствует и на хабре под псевдонимом… DmitryBaranovskiy (сюрприз!) и, по совместительству, является разработчиком Raphaël—JavaScript Library.

Читая его блог, я наткнулся на его пост «JavaScript Without „if“», и вспомнил, что у меня валяется в загашниках очень похожая штука:

1
2
3
4
5
6
7
8
9
10
11
12
IF = {
    'true' : function () {
        alert('true');
    },
    'false' : function () {
        alert('false')
    }
};

IF[(5 < 4)](); // should be false

IF[(typeof window.UnusualAndStrangeProperty === 'undefined')](); // should be true

Думаю, как это работает, очевидно, поэтому я хочу заострить внимание на другом: такая конструкция, по идее, должна работать достаточно быстро, так как доступ к свойствам объекта в javascript очень быстр. Правда, в таком случае мы платим памятью за скорость. И действительно, тесты в safari показывают, что этот код лишь чуть-чуть медленнее классической конструкции if… else. Про остальные браузеры ничего не могу сказать, так как всесторонним тестированием не занимался — да и не стоит оно того, это же чисто proof of concept.

В общем, как обычно, гибкость javascript достойна всяческих похвал. Если в этом языке чего-то не хватает, то это что-то легко может быть дописано руками.