четверг, июля 10, 2008

сладкий функциональный макрос в яваскрипт

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

приведу классический пример:


Array.prototype.each= function( callback ){
for( var i= 0, len= this.length; i < len; ++i )
callback.call( this, this[ i ], i );
};

var summ= 0;
[-1,1,2,3].each( function( val, key ){ summ+= val } );
alert( summ );


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

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

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


var $func= function( func ){
eval(
'func=' + String( func )
.replace( /\{\$:/g, 'function($){return ' )
);
return func;
};


а вот пример использования:


$func( function( ){

Array.prototype.each= function( callback ){
for( var i= 0, len= this.length; i < len; ++i )
callback.call( this, { key: i, val: this[ i ] } );
};

var summ= 0;
[-1,1,2,3].each( {$: summ+= $.val } );
alert( summ );

})();


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


{$: /* какой-то код,
результат выполнения которого будет возвращён функцией */ }

воскресенье, февраля 10, 2008

Игровая индустрия не мертва!

Valve не перестаёт радовать. Если не брать в расчёт "эпизодовую жевачку", то все их игры отменного качества. Это прежде всего ремейки таких хитов как Half Life и Counter Strike. Недавно к ним довились Team Fortress 2 и Portal. О последнем и пойдёт сегодня речь...

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

Отлично продуманные, разнообразные уровни. Харизматичный сумасшедший искуственный интеллект. Футуристичная атмосфера, приправленная изрядной долей фарса. Ну и конечно же - многочисленные физические головоломки с использованием порталов.

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

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

пятница, января 25, 2008

Зомби

Сегодня речь пойдёт о "зомби" или, говоря псевдонаучным языком, "человек непроснувшийся, но двигающийся в направлении работы".

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

Вы думаете пропускной способности эскалатора недостаточно, чтобы их всех разместить? Как бы не так! Все они ждут своей очереди вступить лишь на правую сторону ступеньки. Левая же сторона остаётся на многие метры пуста. Если бы зомби распределялись по обоим сторонам равномерно - не было бы этой давки перед эскалатором. При этом по громкоговорителю периодически объявляют: "вставайте на обе стороны, не создавайте пробок", - но зомби, естественно это не слышат...

среда, января 16, 2008

Подводные грабли XSLT

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

Тут я приведу основные грабли на которые я напоролся и способы их обхода.

1. в мозилле не работает xsl:disable-output-escaping, то есть нельзя трансформировать текст в xml, что в некоторых случаях весьма удобно. в противоположность этому xslt не поддерживает сериализацию в текст, что тоже было бы удобно. в обоих случаях приходится либо на сервере нужным образом подготавливать данные, либо писать нетривиальные шаблоны для трансформации.

2. в ие нельзя указывать xsl:method="xml" ибо тогда к выходному xml-лю будет дописан xml-декларация (да, omit-xml-declaration он игнорирует ), что приводит к переводу ие в режим совместимости с древними глючными версиями. то есть метод должен быть только "html"

3. однако, если указать xsl:method="html", то в опере перестают работать формы o_0. точнее, они работают, но не посылают ни одного поля. исследования показали, поля ввода по неизвестной причине просто не привязываются к форме. причина оказалась в web forms 2.0:
Setting an element's form attribute to the empty string (or to a string consisting only of IDs that do not correctly identify form elements) just disassociates the form control from its form, leaving it unassociated with any form.
и опера, как на зло, воспринимает неустановленный атрибут "form" как установленный в значение "пустая строка". вывод - нужно задать форме идентификатор, а всем полям - атрибут form с тем же значением. уже второй раз напарываюсь на этот кривой html5.0 (слоган которого - "обратная совместимость - наше всё") и его не менее кривую реализацию в опере (-_-)

4. xsl:fallback не поддерживает ни один браузер, хотя его-то нужно было бы реализовать в первую очередь! Впрочем, внутри шаблонов можно по старинке фильтровать браузеры.

5. бойтесь вгружать xml+xslt в элемент iframe и делать "рефрэш страницы" - мозилле от этого становится очень грустно и она делает себе сэпукку. это довольно древний баг, который до сих пор так никто и не удосужился исправить. вместо ифрейма можно использовать object, правда у него есть некоторые косяки в ие...

upd: ко мне тут пришла гениально простая мысль ^_^ можно использовать method="xml", а ие переводить в режим соответствия стандартам простеньким скриптом:
window.onload= function(){
var html= document.documentElement.outerHTML;
if( html && ( document.compatMode == 'BackCompat' ) )
document.write( '<!DOCTYPE html>\n' + html );
}

понедельник, ноября 26, 2007

что может быть хуже чем показывать и смотреть рекламу? отлавливать в ней ошибки!

повесили на один сайт google adsense. в мозилле, опере всё пучком, а ИЕ что-то кортачится - ничего не показывает кроме ошибок: "незавершённая строковая константа" и "недопустимый символ". в качестве адреса указывает нашу страницу. номер строки и символа - циркулирует между пятком вариантов.

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

страницы у нас отдаются в utf-8, но гугол свою рекламу почему-то отдаёт в windows-1251. подозреваю он определяет язык (по региону или по http-заголовку, не суть в общем) в соответствии с ним отбирает объявления (из 6 ссылок 1-2 на русском языке) и по неизвестной причине выбирает кодировку 1251. ие в заголовках её не запрашивает, исходная страница в utf-8, видимо гугол просто для русского языка по дефолту шлёт 1251 и тем самым совершенно не учитывает поведение детища мелкософта - эта мохнатая скотина плевать хотела на http-заголовки подгружаемого яваскрипта. ие при загрузке скриптов и стилей устанавливает для них ту же кодировку, что и на странице для которой они загружаются. как следствие, ие думал, что подгружаемый гуглоскрипт с рекламными данными был в кодировке utf-8 и встретив там русские буквы, которые не входят в ASCII-7, получал совершенно невообразимые коды символов.

как обойти такое поведение ИЕ? да очень просто! есть два варианта:
1. отдавать скрипты в той же кодировке, что и исходная страница.
2. указать в тэге <script> атрибут charset содержащий код нужной кодировки.
если меня читают товарищи из гугла, то в этот их скрипт нужно добавить:
document.write('<script language="JavaScript1.1" 
charset="windows-1251" src="'+c+'"><\/script>')
естественно вместо "windows-1251" нужно подставить ту кодировку в которой собираемся грузить данные.

да, и отдельное спасибо за то, что мне пришлось копаться в этой лапше (-_-)

четверг, ноября 08, 2007

Ещё несколько жаббер ботов

imified{нэко}imified{нэзу}com - этот бот много чего умеет. в частности, через него я сейчас пишу этот пост в блог. сбылась мечта идиота ^_^
сразу после регистрации у вас появляются виджеты "заметки", "напоминания" и "планировщик", но ткните на пункт "My Account" и бот выдаст вам ссылку пройдя по которой вы сможете настроить ваш аккаунт - выбрать те виджеты, которыми вы хотите пользоваться.

семейство ботов disk.jabbim.cz:
private{нэко}disk{нэзу}jabbim{нэзу}cz - приватное файлохранилище
public{нэко}disk{нэзу}jabbim{нэзу}cz - публичное файлохранилище
album{нэко}disk{нэзу}jabbim{нэзу}cz - веб-альбом
общий объём - 50мб. не густо, но например для быстрой публикации скриншотов должно хватить.
публичные файлы доступны по адресу вида: http://disk.jabbim.cz/jabberID/
альбом располагается по адресу вида: http://album.jabbim.cz/jabberID/
, где вместо jabberID нужно подставить ваш jabberID ^_^

понедельник, ноября 05, 2007

Вы читаете машина переведена страницу

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

ВАЖНО: Вы читаете машина переведена страницу, которая предоставляется "как есть" без гарантии. В отличие от человеческого перевода, машинный перевод не понимает грамматика, семантика, синтаксис, идиомы на естественном языке, что часто приводят неточные и низкое качество текста, который вводит в заблуждение и непонятным. Таким образом, обратитесь оригинальный английский статью, когда сомнения.

вторник, октября 30, 2007

операция прервана высшими силами

недавно столкнулся с такой проблемой в IE: при переходе на следующую страницу он выдаёт алерт "не удалось открыть узел... операция прервана" и отказывается грузить страницу. ctrl+f5 обычно спасает положение. так и не понял почему это происходит, но связано это с тем, что скрипт пытается работать с dom в то время как его уже/ещё не существует.

суббота, октября 27, 2007

объекты, хэш-таблицы и яваскрипт

как известно, всё в яваскрипт является объектами.

"как это всё?" - спросит подкованный читатель, - "а как же примитивные типы?"
а примитивные типы - тоже объекты, только несколько иные...

разберёмся с терминологией:
объект - понятие довольно абстрактное, означающее "некая сущность обладающая состоянием и поведением".
примитивные типы в яваскрипте безусловно обладают и состоянием (собственно значение) и поведением (методы, которые они наследуют от своего прототипа)

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

каждый примитивный тип имеет своё уникальное поведение: при попытке доступа к полям они конвертятся в свои типы объектов и наследуют соответствующий набор полей от прототипа. значит примитивные типы - тоже объекты.

но что в них такого особенного?

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

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

ps: вот что действительно не является объектами, так это значения null и undefined. и это очень печально (-_-)

воскресенье, октября 21, 2007

светлое будущее, наконец, наступило!

помните, с чего началась вся эта эпопея с xml, xsl, xhtml и прочими иксами?

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

тогда появился xml - формат не накладывающий ограничений на структуру данных. в нём можно использовать свои тэги, вкладывать так как считаешь правильным и многое другое.
естественно, браузеру всё-таки надо было объяснить как эти данные следует отображать. css был недостаточно функционален для отображения произвольных данных, поэтому был разработан xsl, который весьма прохладно был воспринят создателями браузеров. тем не менее, его младшему брату xslt повезло больше: ввиду того, что он не требует переписывать весь браузерный движок, а выступает в качестве посредника, трансформирующего исходный xml в html уже понятный браузеру, его поддержка довольно быстро появилась в ИЕ, мозилле и сафари - основной троице браузерных движков. последней, сравнительно недавно, к ним подключилась и опера (девятая версия).

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

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

чтобы не быть голословным, предлагаю реализацию на php:
function native2xml( $var, $name='root' ){
$xml= '';
if( is_object( $var ) || is_array( $var ) ):
foreach( $var as $n => $v )
$xml.= native2xml( $v, $n );
else:
$xml= htmlspecialchars( $var, ENT_NOQUOTES, 'UTF-8' );
endif;
if( is_numeric( $name ) ) $name= 'item';
return '<'.$name.'>'.$xml.'';
}


просто передайте этой функции дерево объектов и получите на выходе xml-строку.

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

из минусов такого подхода:
1. мы ограничиваемся исключительно языком xslt, о недостатках которого я уже писал.
2. для поисковиков и устаревших браузеров нужно производить эти трансформации на сервере.

есть ещё два варианта "объяснения" браузеру как работать с данными:
1. javascript - трансформирование с его помощью - редкостный изврат.
2. OWL - очень мощная технология, но на данный момент никем не поддерживаемая. есть подозрение, что её ждёт та же учесть, что и XSL (-_-)

пятница, октября 19, 2007

YSLT - продолжение идей XSLT

XSLT - самый мощный язык шаблонов, но в нём есть несколько недостатков:
1. нельзя вкладывать шаблоны друг в друга. всё равно, что при программировании пользоваться исключительно глобальными переменными. рано или поздно начинаются конфликты, при большом числе шаблонов сложно отслеживать какой где используется.
2. нельзя использовать xpath для вывода информации в текстовые узлы. точнее можно, но довольно громоздкой конструкцией.

для решения этих и других проблем я надумал сообразить свой темплейтный движок с идеологией схожей с xslt.
наглядный пример можно найти по этой ссылке: http://phpclub.ru/talk/showthread.php?postid=752263#post752263

вторник, октября 16, 2007

ластюфм жжот

в кое то веки залез на почту и обнаружил там среди прочего спама письмо от "последней радиостанции" такого содержания:

---
Warning: Smarty error: unable to read resource: "notification_emails/digest.tpl" in /usr/local/lib/php/Smarty.class.php on line 1101
---

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

суббота, октября 13, 2007

суббота, сентября 29, 2007

Почему я пишу безграмотно?

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

в чём причина?

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

для чего сущетвует язык и письмо в частности?

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

ближе к делу...

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

почему произнося ЁЖЫК мы должны писать ЁЖИК? Ы - это какая-то недобуква, кою нельзя писать всуе?

почему произнося КАРАТЭ мы должны писать КАРАТЕ? что это за тупая калька с английского? Э - это тоже недобуква не достойная быть написанной?

а буквы Е, Ё, Ю, Я - зачем были введены, если они читаются не иначе как Э, О, У, А? да, отличие их в том, что после твёрдой согласной они делают её мягкой, а в остальных случаях читается, как ЙЭ, ЙО, ЙУ, ЙА. так почему бы не использовать для записи эту самую Й и мягкий знак (от которого всё-равно никуда не деться) для смягчения?

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

подведу итог: по принцыпиальным соображениям я использую местоимение "ты", это никак не связанно со степенью уважения собеседника (что проявляется прежде всего по смыслу текста); также я пишу Э, Ы и другие "недобуквы"там где они чётко слышатся; от Е, Ё, Я и Ю я не отказываюсь, ибо это вызовет серьёзные трудости восприятия написанного мной текста обычными ("непросветлёнными" ^_^) людьми, более того, я употребляю и Ё, ибо Е ни коим образом не способна её заменить.

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

среда, сентября 26, 2007

php -> javascript -> ...

кто сказал, что в php нет ни динамического, ни множественного наследования?
уже есть: http://php.ru/forum/viewtopic.php?t=7870

и пусть только кто-нибудь после этого скажет, что в php слабый ООП... |_(~_~)_/