tag:blogger.com,1999:blog-82218903383833040452024-03-14T12:00:02.983+03:00БЛОГНОТSKIS! <br/>
(Stupid, Keep It Simple!) <br/>
Проще надо быть, товарищи!Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.comBlogger55125tag:blogger.com,1999:blog-8221890338383304045.post-47754089261688533402008-07-10T17:40:00.002+04:002008-07-10T17:46:36.609+04:00сладкий функциональный макрос в яваскрипткак известно, создавать на яваскрипте короткие инлайн колбэк функции - не слишком приятное занятие - получается много кода со множеством скобочек.<br /><br />приведу классический пример:<br /><br /><pre><br />Array.prototype.each= function( callback ){<br /> for( var i= 0, len= this.length; i < len; ++i )<br /> callback.call( this, this[ i ], i );<br />};<br /><br />var summ= 0;<br />[-1,1,2,3].each( function( val, key ){ summ+= val } );<br />alert( summ );<br /></pre><br /><br />тут в метод итерирования передаётся функция замкнутая на текущий контекст, которая должна выполнить нужные нам операции для каждого элемента массива. довольно многословно, не правда ли? было бы замечательно хотябы сделать короткий алиас для ключевого слова function, но яваскрипт ничего такого не позволяет -_-<br /><br />единственное возможное решение в таком случае - использовать какой-либо препроцессор. но завязываться на серверную или оффлайновую предобработку как-то не очень хочется. а если помещать код в яваскрипт в виде строки, то мы теряем подсветку синтаксиса. тобишь необработанный код должен сохранять синтаксическую совместимость с яваскриптом.<br /><br />что ж, решение есть и довольно красивое... вот простая функция, динамически меняющая исходный код переданной в качестве аргумента функции:<br /><br /><pre><br />var $func= function( func ){<br /> eval(<br /> 'func=' + String( func )<br /> .replace( /\{\$:/g, 'function($){return ' )<br /> );<br /> return func;<br />};<br /></pre><br /><br />а вот пример использования:<br /><br /><pre><br />$func( function( ){<br /><br />Array.prototype.each= function( callback ){<br /> for( var i= 0, len= this.length; i < len; ++i )<br /> callback.call( this, { key: i, val: this[ i ] } );<br />};<br /><br />var summ= 0;<br /><strong>[-1,1,2,3].each( {$: summ+= $.val } );</strong><br />alert( summ );<br /><br />})();<br /></pre><br /><br />тут весь код приложения засовывается в функцию, пропускается через препроцессор и потом исполняется. при этом внутри можно создавать инлайн-функции используя простой и элегантный синтаксис:<br /><br /><pre><br />{$: /* какой-то код,<br />результат выполнения которого будет возвращён функцией */ }<br /></pre>Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com15tag:blogger.com,1999:blog-8221890338383304045.post-41027299857122255982008-02-10T01:19:00.000+03:002008-02-10T02:19:51.608+03:00Игровая индустрия не мертва!Valve не перестаёт радовать. Если не брать в расчёт "эпизодовую жевачку", то все их игры отменного качества. Это прежде всего ремейки таких хитов как Half Life и Counter Strike. Недавно к ним довились Team Fortress 2 и Portal. О последнем и пойдёт сегодня речь...<br /><br />Жанр этого чуда - квест. Трёхмерный квест со совершенно новым геймплеем. Я вообще не люблю квесты, ибо они в массе своей скучны и однообразны. Но этот я прошёл аж два раза на одном дыхании (второй раз - закрепляя навыки и читая комменты разработчиков).<br /><br />Отлично продуманные, разнообразные уровни. Харизматичный сумасшедший искуственный интеллект. Футуристичная атмосфера, приправленная изрядной долей фарса. Ну и конечно же - многочисленные физические головоломки с использованием порталов.<br /><br />Отдельно хочется отметить <a href="http://dark-demon.1000mb.ru/file/47/3980_01_Still_Alive.mp3">эндинг</a> - пипец какая кавайная песенка. Вот бы и остальные оперные певицы забили на свою лажу и начали бы петь нормальные песни. Но нет, обладательницы красивых голосов поют какую-то фигню, а хорошие песни поют обычно кто-попало.<br /><br />Порталы - редкостная игра сделанная, как говорится, с душой и качественно. Вальве большущий респект за то, что не побоялись вложить бабки в столь смелый проект!Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com1tag:blogger.com,1999:blog-8221890338383304045.post-72013590536546742482008-01-25T16:17:00.000+03:002008-01-25T16:20:45.121+03:00ЗомбиСегодня речь пойдёт о "зомби" или, говоря псевдонаучным языком, "человек непроснувшийся, но двигающийся в направлении работы".<br /><br />Так вот, каждый рабочий день я наблюдаю следующую картину: у входа на эскалатор стоит толпа зомби, каждый из которых терпеливо ждёт своей очереди вступить на бегущие вниз ступеньки.<br /><br />Вы думаете пропускной способности эскалатора недостаточно, чтобы их всех разместить? Как бы не так! Все они ждут своей очереди вступить лишь на правую сторону ступеньки. Левая же сторона остаётся на многие метры пуста. Если бы зомби распределялись по обоим сторонам равномерно - не было бы этой давки перед эскалатором. При этом по громкоговорителю периодически объявляют: "вставайте на обе стороны, не создавайте пробок", - но зомби, естественно это не слышат...Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com1tag:blogger.com,1999:blog-8221890338383304045.post-61648664234797798162008-01-16T11:25:00.003+03:002008-06-14T23:55:27.966+04:00Подводные грабли XSLTНаверняка каждый, кто пытался заюзать клиентскую шаблонизацию посредством xslt сталкивался с неадэкватным поведением некоторых браузеров. Многие просто поворачивали назад, но некоторые продолжали упорно искать лазейки для написания кроссбраузерных приложений.<br /><br />Тут я приведу основные грабли на которые я напоролся и способы их обхода.<br /><br />1. в мозилле не работает <span style="font-style: italic;">xsl:disable-output-escaping</span>, то есть нельзя трансформировать текст в xml, что в некоторых случаях весьма удобно. в противоположность этому xslt не поддерживает сериализацию в текст, что тоже было бы удобно. в обоих случаях приходится либо на сервере нужным образом подготавливать данные, либо писать нетривиальные шаблоны для трансформации.<br /><br />2. в ие нельзя указывать <span style="font-style: italic;">xsl:method="xml"</span> <span style="font-style: italic;"><xsl:output method="xml"></xsl:output></span> ибо тогда к выходному xml-лю будет дописан xml-декларация (да, omit-xml-declaration он игнорирует ), что приводит к переводу ие в режим совместимости с древними глючными версиями. то есть метод должен быть только "html"<br /><br />3. однако, если указать <span style="font-style: italic;">xsl:method="html"</span>, то в опере перестают работать формы o_0. точнее, они работают, но не посылают ни одного поля. исследования показали, поля ввода по неизвестной причине просто не привязываются к форме. причина оказалась в <a href="http://www.whatwg.org/specs/web-forms/current-work/#formAttribute">web forms 2.0</a>:<br /><blockquote>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.</blockquote>и опера, как на зло, воспринимает неустановленный атрибут "form" как установленный в значение "пустая строка". вывод - нужно задать форме идентификатор, а всем полям - атрибут form с тем же значением. уже второй раз напарываюсь на этот кривой html5.0 (слоган которого - "обратная совместимость - наше всё") и его не менее кривую реализацию в опере (-_-)<br /><br />4. <span style="font-style: italic;">xsl:fallback</span> не поддерживает ни один браузер, хотя его-то нужно было бы реализовать в первую очередь! Впрочем, внутри шаблонов можно по старинке <a href="http://developer.mozilla.org/en/docs/XSL_Transformations_in_Mozilla_FAQ#What_about_document.write.3F">фильтровать браузеры</a>.<br /><br />5. бойтесь вгружать xml+xslt в элемент iframe и делать "рефрэш страницы" - мозилле от этого становится очень грустно и она делает себе сэпукку. это довольно древний баг, который до сих пор так никто и не удосужился исправить. вместо ифрейма можно использовать object, правда у него есть некоторые косяки в ие...<br /><br />upd: ко мне тут пришла гениально простая мысль ^_^ можно использовать method="xml", а ие переводить в режим соответствия стандартам простеньким скриптом:<br /><pre>window.onload= function(){<br /> var html= document.documentElement.outerHTML;<br /> if( html && ( document.compatMode == 'BackCompat' ) ) <br /> document.write( '<!DOCTYPE html>\n' + html );<br />}</pre>Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com6tag:blogger.com,1999:blog-8221890338383304045.post-48285804655942800702007-11-26T19:05:00.000+03:002007-11-26T21:11:27.019+03:00что может быть хуже чем показывать и смотреть рекламу? отлавливать в ней ошибки!повесили на один сайт google adsense. в мозилле, опере всё пучком, а ИЕ что-то кортачится - ничего не показывает кроме ошибок: "незавершённая строковая константа" и "недопустимый символ". в качестве адреса указывает нашу страницу. номер строки и символа - циркулирует между пятком вариантов.<br /><br />если бы эта проблема наблюдалась только в мозилле - я бы взял огнебаг, да отдебажил по самое небалуйся, но под ИЕ, к сожалению, ничего подобного нет (-_-) причём ошибка выскакивала только в шестом ИЕ. седьмой же - не возникал и спосойно отображал рекламу. правда русские буквы он отображал исключительно вопросительными знаками. сначала я не обратил на это особого внимания, но как потом оказалось - зря.<br /><br />страницы у нас отдаются в utf-8, но гугол свою рекламу почему-то отдаёт в windows-1251. подозреваю он определяет язык (по региону или по http-заголовку, не суть в общем) в соответствии с ним отбирает объявления (из 6 ссылок 1-2 на русском языке) и по неизвестной причине выбирает кодировку 1251. ие в заголовках её не запрашивает, исходная страница в utf-8, видимо гугол просто для русского языка по дефолту шлёт 1251 и тем самым совершенно не учитывает поведение детища мелкософта - эта мохнатая скотина плевать хотела на http-заголовки подгружаемого яваскрипта. ие при загрузке скриптов и стилей устанавливает для них ту же кодировку, что и на странице для которой они загружаются. как следствие, ие думал, что подгружаемый гуглоскрипт с рекламными данными был в кодировке utf-8 и встретив там русские буквы, которые не входят в ASCII-7, получал совершенно невообразимые коды символов.<br /><br />как обойти такое поведение ИЕ? да очень просто! есть два варианта:<br />1. отдавать скрипты в той же кодировке, что и исходная страница.<br />2. указать в тэге <script> атрибут charset содержащий код нужной кодировки.<br />если меня читают товарищи из гугла, то в <a href="http://www.google.com/afsonline/show_afs_ads.js">этот их скрипт</a> нужно добавить:<br /><pre>document.write('<script language="JavaScript1.1" <br /><strong>charset="windows-1251"</strong> src="'+c+'"><\/script>')</pre> естественно вместо "windows-1251" нужно подставить ту кодировку в которой собираемся грузить данные.<br /><br />да, и отдельное спасибо за то, что мне пришлось копаться в этой лапше (-_-)Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com1tag:blogger.com,1999:blog-8221890338383304045.post-5043561754675124902007-11-08T12:18:00.001+03:002007-11-08T12:30:37.871+03:00Ещё несколько жаббер ботов<div xmlns="http://www.w3.org/1999/xhtml"><b>imified{нэко}imified{нэзу}com </b> - этот бот много чего умеет. в частности, через него я сейчас пишу этот пост в блог. сбылась мечта идиота ^_^<br />сразу после регистрации у вас появляются виджеты "заметки", "напоминания" и "планировщик", но ткните на пункт "My Account" и бот выдаст вам ссылку пройдя по которой вы сможете настроить ваш аккаунт - выбрать те виджеты, которыми вы хотите пользоваться.<br /><br />семейство ботов disk.jabbim.cz:<br /><b>private{нэко}disk{нэзу}jabbim{нэзу}cz</b> - приватное файлохранилище<br /> </div><b>public{нэко}disk{нэзу}jabbim{нэзу}cz</b> - публичное файлохранилище<br /><b>album{нэко}disk{нэзу}jabbim{нэзу}cz</b> - веб-альбом<br />общий объём - 50мб. не густо, но например для быстрой публикации скриншотов должно хватить.<br />публичные файлы доступны по адресу вида: http://disk.jabbim.cz/jabberID/<br />альбом располагается по адресу вида: http://album.jabbim.cz/jabberID/<br />, где вместо jabberID нужно подставить ваш jabberID ^_^Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com2tag:blogger.com,1999:blog-8221890338383304045.post-19978503913992557502007-11-05T00:19:00.000+03:002007-11-05T00:26:24.836+03:00Вы читаете машина переведена страницублуждая по всемирной помойке наткнулся на статью написанную корявым языком. то, что переведено автоматом это понятно, совсем убила приписка в конце:<br /><br /><blockquote><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span style="color:red;"><strong>ВАЖНО:</strong></span> Вы читаете машина переведена страницу, которая предоставляется "как есть" без гарантии.</span><span onmouseover="_tipon(this)" onmouseout="_tipoff()"> В отличие от человеческого перевода, машинный перевод не понимает грамматика, семантика, синтаксис, идиомы на естественном языке, что часто приводят неточные и низкое качество текста, который вводит в заблуждение и непонятным.</span> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;"></span> Таким образом, обратитесь </span><a href="http://www.mydigitallife.info/2007/03/16/samsung-sph-9000-new-mobile-wimax-gadget/"><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;"></span> оригинальный английский статью</span></a><span onmouseover="_tipon(this)" onmouseout="_tipoff()">, когда сомнения.</span><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;"></span></span><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;"></span></span><span onmouseover="_tipon(this)" onmouseout="_tipoff()"></span></blockquote>Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com2tag:blogger.com,1999:blog-8221890338383304045.post-78008708445948460252007-10-30T18:57:00.000+03:002007-10-30T19:05:08.241+03:00операция прервана высшими силаминедавно столкнулся с такой проблемой в IE: при переходе на следующую страницу он выдаёт алерт "не удалось открыть узел... операция прервана" и отказывается грузить страницу. ctrl+f5 обычно спасает положение. так и не понял почему это происходит, но связано это с тем, что скрипт пытается работать с dom в то время как его уже/ещё не существует.Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com14tag:blogger.com,1999:blog-8221890338383304045.post-4325874023281952222007-10-27T12:44:00.000+04:002007-11-04T17:03:45.934+03:00объекты, хэш-таблицы и яваскрипткак известно, всё в яваскрипт является объектами.<br /><br />"как это всё?" - спросит подкованный читатель, - "а как же примитивные типы?"<br />а примитивные типы - тоже объекты, только несколько иные...<br /><br />разберёмся с терминологией:<br /><a href="http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29">объект</a> - понятие довольно абстрактное, означающее "некая сущность обладающая состоянием и поведением".<br />примитивные типы в яваскрипте безусловно обладают и состоянием (собственно значение) и поведением (методы, которые они наследуют от своего прототипа)<br /><br />пытливый читатель может тут возразить, что на самом деле в случае вызова метода примитивный тип просто конвертится в объект, который уже наследует методы. и будет прав! но это не отменяет того факта, что метод-то мы вызываем для переменной содержащей примитивное значение и от состояния этого значения может быть вызван разный метод и дать, соответственно, разный результат.<br /><br />каждый примитивный тип имеет своё уникальное поведение: при попытке доступа к полям они конвертятся в свои типы объектов и наследуют соответствующий набор полей от прототипа. значит примитивные типы - тоже объекты.<br /><br />но что в них такого особенного?<br /><br />в отличие от остальных объектов примитивне объекты не являются хэш-таблицами, то есть их состояние определяется одним единственным безымянным полем. им нельзя добавить дополнительных полей (в том числе и содержащих функции), но они могут отнаследовать их от прототипа. для доступа к полям при этом используется скрытый автоматически создаваемый объект-посредник, ибо примитивные объекты не могут иметь именованных полей.<br /><br />основной недостаток яваскрипта заключается в том, что переменная this внутри методов указывает на объект-посредник, а не на примитивный объект, в результате чего внутри метода мы не можем узнать является ли объект, в контексте которого происходит вызов, самостоятельным объектом или объектом-посредником. а это бывает важно в свете того, что передача полноценных объектов происходит по ссылке, а примитивных - по значению.<br /><br />ps: вот что действительно не является объектами, так это значения null и undefined. и это очень печально (-_-)Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com2tag:blogger.com,1999:blog-8221890338383304045.post-32859723842383764472007-10-21T20:31:00.000+04:002007-10-21T21:20:52.364+04:00светлое будущее, наконец, наступило!помните, с чего началась вся эта эпопея с xml, xsl, xhtml и прочими иксами?<br /><br />сначала был html, представляющий из себя кашу из данных, оформления и поведения.<br />потом появились такие технологии как css и javascript, которые позволяли отделить от данных оформление и поведение, но в данных всё-равно оставалось много мусора - семантически незначимых конструкций, а представлять данные требовалось так как их может воспринять браузер - ограничиваясь весьма жёсткими рамками html.<br /><br />тогда появился xml - формат не накладывающий ограничений на структуру данных. в нём можно использовать свои тэги, вкладывать так как считаешь правильным и многое другое.<br />естественно, браузеру всё-таки надо было объяснить как эти данные следует отображать. css был недостаточно функционален для отображения произвольных данных, поэтому был разработан xsl, который весьма прохладно был воспринят создателями браузеров. тем не менее, его младшему брату xslt повезло больше: ввиду того, что он не требует переписывать весь браузерный движок, а выступает в качестве посредника, трансформирующего исходный xml в html уже понятный браузеру, его поддержка довольно быстро появилась в ИЕ, мозилле и сафари - основной троице браузерных движков. последней, сравнительно недавно, к ним подключилась и опера (девятая версия).<br /><br />что мы получили в итоге? получили мы возможность на запрос клиента отдавать только данные в удобной нам форме. если браузер не знает что эти данные означают - он качает xslt и трансформирует их в xhtml. если он не знает как они должны выглядеть - качает css и показывает. если же он не знает как они должны себя вести - качает javascript. xslt, css и javascript качаются один раз и оседают в кэше. при каждом запросе передаётся только экстакт данных в формате xml.<br /><br />более-менее продвинутый читатель, наверно, уже заметил, что формирование xml ничем принципиально не отличается от формирования html. отчасти это так. если мы формируем документ-ориентированный xml, то придётся вручную вставлять данные в нужные места. но, если наша цель - формирование xml ориентированного на данные, то его формирование можно возложить на автоматику, которая преобразует родные для языка программирования объекты в неродное xml дерево.<br /><br />чтобы не быть голословным, предлагаю реализацию на php: <pre>function native2xml( $var, $name='root' ){<br /> $xml= '';<br /> if( is_object( $var ) || is_array( $var ) ):<br /> foreach( $var as $n => $v )<br /> $xml.= native2xml( $v, $n );<br /> else:<br /> $xml= htmlspecialchars( $var, ENT_NOQUOTES, 'UTF-8' );<br /> endif;<br /> if( is_numeric( $name ) ) $name= 'item';<br /> return '<'.$name.'>'.$xml.'<!--'.$name.'-->';<br />}</pre><br /><br />просто передайте этой функции дерево объектов и получите на выходе xml-строку.<br /><br /><a href="http://tenshi.jino-net.ru/xslt-forms/">тут</a> вы можете скачать рабочий пример, демонстрирующий вывод формы и локализацию основанную на xslt (приглядитесь, в xml пересылаются английские фразы, но отображаются они в браузере на русском языке).<br /><br />из минусов такого подхода:<br />1. мы ограничиваемся исключительно языком xslt, о недостатках которого я уже писал.<br />2. для поисковиков и устаревших браузеров нужно производить эти трансформации на сервере.<br /><br />есть ещё два варианта "объяснения" браузеру как работать с данными:<br />1. javascript - трансформирование с его помощью - редкостный изврат.<br />2. <a href="http://www.blogger.com/a.org/wiki/Web_Ontology_Language">OWL</a> - очень мощная технология, но на данный момент никем не поддерживаемая. есть подозрение, что её ждёт та же учесть, что и XSL (-_-)Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com1tag:blogger.com,1999:blog-8221890338383304045.post-52915646059181120642007-10-19T20:26:00.000+04:002007-10-19T21:46:40.937+04:00YSLT - продолжение идей XSLTXSLT - самый мощный язык шаблонов, но в нём есть несколько недостатков:<br />1. нельзя вкладывать шаблоны друг в друга. всё равно, что при программировании пользоваться исключительно глобальными переменными. рано или поздно начинаются конфликты, при большом числе шаблонов сложно отслеживать какой где используется.<br />2. нельзя использовать xpath для вывода информации в текстовые узлы. точнее можно, но довольно громоздкой конструкцией.<br /><br />для решения этих и других проблем я надумал сообразить свой темплейтный движок с идеологией схожей с xslt.<br />наглядный пример можно найти по этой ссылке: <a href="http://phpclub.ru/talk/showthread.php?postid=752263#post752263">http://phpclub.ru/talk/showthread.php?postid=752263#post752263</a>Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com0tag:blogger.com,1999:blog-8221890338383304045.post-53001238541628430282007-10-18T22:32:00.000+04:002008-11-15T14:41:14.613+03:00интересно, почему же я не люблю древовидные обсуждения?<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6_oUKW9SckwzQJhI0WAUotCO0Dp_m_IVNJlXZHPIQDEffm-geeR7BKMl3HDSa1lwq6PGMOlYZvRnt0KjWSLtekV2yPvWaMyACmm2RDMT9LFNvFNvmkGaHmKJS6dh3vHEVf-KERgNU5eT5/s1600-h/tree.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6_oUKW9SckwzQJhI0WAUotCO0Dp_m_IVNJlXZHPIQDEffm-geeR7BKMl3HDSa1lwq6PGMOlYZvRnt0KjWSLtekV2yPvWaMyACmm2RDMT9LFNvFNvmkGaHmKJS6dh3vHEVf-KERgNU5eT5/s400/tree.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5122747062252758018" /></a>Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com1tag:blogger.com,1999:blog-8221890338383304045.post-91212969824105069432007-10-16T13:42:00.000+04:002007-10-16T13:52:36.384+04:00ластюфм жжотв кое то веки залез на почту и обнаружил там среди прочего спама письмо от "последней радиостанции" такого содержания:<br /><br />---<br />Warning: Smarty error: unable to read resource: "notification_emails/digest.tpl" in /usr/local/lib/php/Smarty.class.php on line 1101 <br />---<br /><br />да, подумаешь, куда-то подевался темплейт в результате чего вместо обычной рассылки производится рассылка спама, но нет, это не ошибка - это всего-лишь варнинг ^_^ который естественно никто даже не думает перехватывать..<br />для кого варнинг-то? для программиста или для пользователя?Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com1tag:blogger.com,1999:blog-8221890338383304045.post-27100218892969245592007-10-13T23:31:00.000+04:002007-10-20T06:37:28.791+04:00просто прикольное видео<object height="350" width="425"> <param name="movie" value="http://www.youtube.com/v/NQADJtwnfHQ"> <embed src="http://www.youtube.com/v/NQADJtwnfHQ" type="application/x-shockwave-flash" height="350" width="425"></embed> </object>Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com0tag:blogger.com,1999:blog-8221890338383304045.post-3770546954410026852007-09-29T17:12:00.000+04:002007-09-29T19:08:34.571+04:00Почему я пишу безграмотно?меня сильно угнетает ситуация с русским языком: после <span style="font-weight: bold;">десятилетнего </span>обучения человек так и не может быть уверен в правильности написания того или иного слова, правильности его склонения, расстановки знаков препинания и т.п.<br /><br />в чём причина?<br /><br />а причина в гигантском количестве расплывчатых правил с тонной исключений и центнером исключений из исключений. когда-то люди просто писали как считали правильным - каждый по своему. потом пришёл добрый дядя и на основе этого разнобоя составил свод правил (по истине - великий труд). но язык продолжает естественную эволюцию, а правила как застыли когда-то - так и стоят.<br /><br />для чего сущетвует язык и письмо в частности?<br /><br />чтобы передавать информацию от одного человека к другому. чтобы происходило как можно меньше искажений требуются простые и однозначные правила кодирования и декодирования. да, ни один человек не будет писать чётко по таким правилам - благодаря избыточности у него есть свобода проявить своё творчество, но не надо творчество одного человека или компиляции из трудов группы авторитетных людей возводить в ранг правил.<br /><br />ближе к делу...<br /><br />есть простое и эффективное правило для трансформации голосовой информации в текстовую - "как слышытся - так и пишется". если следовать этому правилу при написании текста - восстановление звуков становится тривиальной задачей. мой респект в этом плане можно смело отдавать японцам которые изобрели кану, предназначенную исключительно для записи звуков как они слышатся, а не так как положено по каким-то там правилам. искуственные языки тоже стараются придерживаться этих правил, но из-за своей искуственности они, к сожалению, никогда не смогут вытеснить естественные, а было бы неплохо ^_^<br /><br />почему произнося ЁЖЫК мы должны писать ЁЖИК? Ы - это какая-то недобуква, кою нельзя писать всуе?<br /><br />почему произнося КАРАТЭ мы должны писать КАРАТЕ? что это за тупая калька с английского? Э - это тоже недобуква не достойная быть написанной?<br /><br />а буквы Е, Ё, Ю, Я - зачем были введены, если они читаются не иначе как Э, О, У, А? да, отличие их в том, что после твёрдой согласной они делают её мягкой, а в остальных случаях читается, как ЙЭ, ЙО, ЙУ, ЙА. так почему бы не использовать для записи эту самую Й и мягкий знак (от которого всё-равно никуда не деться) для смягчения?<br /><br />меня также убивает обращение к человеку во множественном числе ("вы соизволили.."). некоторые даже пишут местоимение при этом с большой буквы, подчёркивая свою безграмотность. оправдывают они это обычно "уважением к собеседнику", не проявляя оного ни коим образом кроме упомянутой формальности. меня часто обвиняют в неуважении по причине употребления местоимение единственного числа ("ты") при общении с конкретным человеком. некоторые даже требуют обращаться к ним во множественном числе, как буд-то у них расщепление личности или ещё какая душевная болезнь. такие перцы у меня не вызывают никакого уважения, ибо они не читают текст сообщения, не пытаются понять смысл, а просто смотрят на формальный признак "употребляет 'ты' - значит не уважает" и всё. тем более гупо выглядят их фразы типа "я к Вам на Вы, б*я".<br /><br />подведу итог: по принцыпиальным соображениям я использую местоимение "ты", это никак не связанно со степенью уважения собеседника (что проявляется прежде всего по смыслу текста); также я пишу Э, Ы и другие "недобуквы"там где они чётко слышатся; от Е, Ё, Я и Ю я не отказываюсь, ибо это вызовет серьёзные трудости восприятия написанного мной текста обычными ("непросветлёнными" ^_^) людьми, более того, я употребляю и Ё, ибо Е ни коим образом не способна её заменить.<br /><br />ps: некоторые "помешанные типографы" не просто ратуют за соблюдение всех правил руского языка, но ещё и считают принципиальной разницу между тире и дефисом, а также между симметричными кавычками-лапками и ассиметричными ёлочками, не смотря на то, что текст воспринимается читателем одинаково хорошо. в вэбе свои правила типографии - пора бы уже с этим смириться.Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com8tag:blogger.com,1999:blog-8221890338383304045.post-29825099097057321392007-09-26T18:11:00.000+04:002007-09-26T18:19:56.768+04:00php -> javascript -> ...кто сказал, что в php нет ни динамического, ни множественного наследования?<br />уже есть: <a href="http://php.ru/forum/viewtopic.php?t=7870">http://php.ru/forum/viewtopic.php?t=7870</a><br /><br />и пусть только кто-нибудь после этого скажет, что в php слабый ООП... |_(~_~)_/Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com0tag:blogger.com,1999:blog-8221890338383304045.post-83895270546387038032007-09-24T12:44:00.000+04:002008-11-15T14:41:14.918+03:00а ксенофобия всё прогрессирует...<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwl5WrrLLUmxhyphenhyphen8oxqbOdIXctccUrdCowk5czYYfzMS4TWq7yCi39z6kX0NdsAB3Pe8NG3PUuWug-Z1BuMzlPogrzivsAbbbcVXQFwhea7ERsS80ERY3yUaLu3rRDaXpR9vNPj9h76A2Ru/s1600-h/372A5C81-9597-4EB1-A583-9F44E718DC37.gif"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwl5WrrLLUmxhyphenhyphen8oxqbOdIXctccUrdCowk5czYYfzMS4TWq7yCi39z6kX0NdsAB3Pe8NG3PUuWug-Z1BuMzlPogrzivsAbbbcVXQFwhea7ERsS80ERY3yUaLu3rRDaXpR9vNPj9h76A2Ru/s400/372A5C81-9597-4EB1-A583-9F44E718DC37.gif" alt="" id="BLOGGER_PHOTO_ID_5113688945935287618" border="0" /></a>проще перечислить с кем русские не успели разжопиться...Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com0tag:blogger.com,1999:blog-8221890338383304045.post-56527446566437248822007-09-21T14:03:00.000+04:002007-09-23T22:22:59.925+04:00\(^_^)/<br />d(^_^)b - в наушниках<br /><br />o_0 - офигевший<br /><br />^,__,^ - вампир<br /><br />^_^' - смущён<br /><br />\m/(^_^)\m/ - на пальцах<br /><br />=^.^= - майский котик<br /><br />/X\(o.o)/X\ - поучок<br /><br />^(oo)^ - свинтус<br /><br />@(*о*)@ - коала<br /><br />(='_'=) - покемон<br /><br />>^,,^< - летучая собака<br /><br />*\o/* - девушка из группы поддержки<br /><br />(<>..<>) - инопланетянин<br /><br />__\o/__ - утопающий<br /><br />(+_+) - трупик<br /><br />неплохая подборка смайлов:<br /><a href="http://www.itc.ua/article.phtml?ID=13123&IDw=53&pid=21">http://www.itc.ua/article.phtml?ID=13123&IDw=53&pid=21</a><br /><br />ещё одна:<br /><a href="http://smayly.net.ru/static/txt.html">http://smayly.net.ru/static/txt.html</a>Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com0tag:blogger.com,1999:blog-8221890338383304045.post-70726540828241759722007-09-18T01:48:00.000+04:002007-10-13T16:04:10.516+04:00установка обработчиков событий в javascriptЯ уже говорил, что люблю яваскрипт? Если нет, то: "лучше языка я ещё не встречал!". Есть, конечно и недостатки, но многие из них можно обойти...<br />Но сейчас пойдёт речь не о недостатках, а наоборот, об одном элегантном решении...<br /><br />Самый простой способ повесить обработчик события - это просто написать:<br /><pre>node.onclick= function( e ){<br /> if( !e ) e= window.event;<br /> alert( e );<br />}</pre><br />Метод довольно простой и наглядный, но основной его недостаток - для одного события у одного узла можно назначить только один обработчик, что очень неудобно.<br /><br />Более сложный способ, лишённый этого недостатка, - это воспользоваться методами addEventListener (DOM) и attachEvent (IE). Например: <a href="http://php.ru/forum/viewtopic.php?t=7374">http://php.ru/forum/viewtopic.php?t=7374</a><br /><br />Работает, конечно, замечательно, но у него есть один существенный недостаток - мы не можем создавать свои события и вешать на них обработчики. В первом варианте у нас такая возможность есть, но обработчик мы можем повесить только один и соответственно городить огород нет особого смысла.<br /><br />И тут мы подходим к самому главному! В яваскрипте любая функция является объектом, а значит она может иметь дополнительные свойства. В частности, можно задать каким-нибудь свойством массив обработчиков, а функция должна просто пройтись по каждому из них и запустить. В итоге у меня получился такой код:<br /><pre>node.observe= function( event, func ){<br />if( !node[event] ){<br /> node[event]= function f( e ){<br /> if( !e ) e= window.event;<br /> var funcs= node[event].funcs;<br /> for( var i= 0; i < funcs.length; ++i ){<br /> if( funcs[i] ) funcs[i]( e );<br /> });<br /> };<br /> node[event].funcs= [];<br />}<br />var funcs= node[event].funcs;<br />for( var i in funcs )<br /> if( funcs[i] == func ) return;<br />funcs.push( func );<br />}<br />node.unobserve= function( event, func ){<br />var funcs= node[event].funcs;<br />for( var i in funcs )<br /> if( funcs[i] == func )<br /> delete funcs[i];<br />}</pre><br />то есть, мы расширяем html-ноду ( хотя, в ИЕ наврятли удастся расширить что-то отличное от html-елемента -_- ну да не суть ) двумя функциями, одна из которых добавляет обработчик, а вторая - удаляет.<br /><br />Примеры использования:<br /><pre>function ping( e ){<br />alert( e );<br />}<br /><br />node.observe( 'onclick', ping );<br /><br />node.unobserve( 'onclick', ping );<br /><br />node.observe( 'onmyevent', ping );<br /><br />node.onmyevent( { keyCode: 1 } );</pre><br /><br />upd: кстати, на событие 'onbeforeunload' и возможно на ещё какие-то нельзя вешать обработчики с помощью addEventListener/attachEvent, ибо некроссбраузерно.<br /><br />upd2: мля... не работает в мозилле в designMode... придётся оной подпорки делать...Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com3tag:blogger.com,1999:blog-8221890338383304045.post-87093712082630549062007-09-10T14:48:00.000+04:002007-09-10T15:02:47.598+04:00одна большая дыркаправильно, речь пойдёт об ИЕ ^_^<br />недавно (ну, месяца два назад) c удивлением обнаружил, что в ИЕ работает даже такая конструкция:<br /><br /><img src="javascript:alert(1)" /><br /><br />что тут можно сказать? только сабж ^_^Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com1tag:blogger.com,1999:blog-8221890338383304045.post-56953133137534615562007-09-07T18:31:00.000+04:002007-09-07T19:27:56.585+04:00выделение, визивиг и изменение контентапри реализации визивига некоторые вещи приходится вытворять по схеме: сериализация->обработка->десериализация<br /><br />в качестве примера - реализация динамической подсветки кода. одними только dom-функциями это реализовывать - страшный геморрой, а ещё и очень медленно. гораздо быстрее и проще пройтись парой регулярок по сериализованному документу.<br /><br />но тут нас подстерегает одна гадость - после обработки хорошо было бы восстановить выделение или хотябы позицию курсора. очевидно, пока выделение ещё существует, нужно сохранить его позиции в dom-е, обработать и по оставленным меткам восстановить выделение.<br /><br />очевидно, что метки начала и конца выделения должны быть неиспользуемой последовательностью символов юникода. также они должны иметь нулевую ширину, дабы при вводе текста не было скачков. я остановился на парах диактрических знаков: '\u0300\u0301' и '\u0302\u0303'. вроде как маловероятно, чтобы в тексте потребовалось их применить последовательно. ширины они точно не имеют. единственный недостаток: они имеют визуализацию, но с учётом того, что обработка должна быть "мгновенной" (ибо рилтаймовая подсветка) - кратковременное появление маленьких значков не должно быть заметно на глаз.<br /><br />пришлось несколько погеморроиться с реализацией этого дела, но всё получилось. отдельный пример не выкладываю ибо его сложно выдрать из фреймворка - выпущу фреймворк - можно будет посмотреть в действии.<br /><br />в ИЕ всё оказалось весьма шоколадно...<br /><br />сохранение меток выглядит так:<br /><br /> var range= document.selection.createRange();<br /> range.pasteHTML( '\u0300\u0301' + range.htmlText + '\u0300\u0301' );<br /><br />восстановление несколько менее тривиально:<br /><br /> var ran= document.body.createRange();<br /> var tr= document.body.createRange();<br /> tr.findText( '\u0300\u0301' );<br /> tr.text= '';<br /> ran.setEndPoint( 'StartToStart', tr );<br /> tr.findText( '\u0302\u0303' );<br /> tr.text= '';<br /> ran.setEndPoint( 'EndToEnd', tr );<br /> ran.select( );<br /><br />а вот реализуя то же самое для остальных браузеров пришлось несколько попотеть...<br /><br />сохранение меток:<br /><br /> var ran= window.getSelection().getRangeAt(0);<br /> var rane= ran.cloneRange( );<br /> rane.collapse( false );<br /> var node= document.createTextNode( '\u0302\u0303' );<br /> rane.insertNode( node );<br /> var node= document.createTextNode( '\u0300\u0301' );<br /> ran.insertNode( node );<br /><br />а для восстановления соответственно приходится бежать по всему дому в поисках открывающей и закрывающей пар node+offset, после чего наведение выделения с помощью функций setStart и setEnd. почему w3c не соизволила узаконить findText остаётся загадкой 8(o_0)8Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com8tag:blogger.com,1999:blog-8221890338383304045.post-49126227251883799222007-09-02T11:29:00.000+04:002007-10-05T17:00:58.795+04:00Теория множеств свернула не тудаЧитая различную литературу каждый раз подмечаю интересную особенность: если автор описывая что-то начинает вдруг использовать эпитеты типа "гениальное", "эпохальное" и тп, то это значит, что читателю пытаются скормить очередную чушь и упомянутые эпитеты призваны усилить аргументацию...<br /><br />Приведу пример из "Что такое математика?" от Куранта, Роббинса под редакцией Колмогорова:<br /><ul><li>Тому же Кантору принадлежит открытие исключительной важности: множество всех действительных (рациональных и иррациональных) чисел несчетно.<br /></li></ul>О других участниках там же идёт повествование в более сухом тоне, местами даже с элементами разоблачения:<br /><ul><li>Евклид, громкая слава которого объясняется той частью его «Начал», которая посвящена основам геометрии (изучаемым в школе), по-видимому, сделал оригинальные открытия в области теории чисел, тогда как его геометрия в значительной степени представляет собой компиляцию ранее полученных результатов.<br /></li></ul>Ну да вернёмся к описываемому гиперболическими эпитетами "открытию"... суть его заключается в том, что Кантор показывает несчётность континуума весьма "остроумным" способом. я бы назвал его скорее софистической спекуляцией понятием "бесконечность".<br /><br />Для начала хотелось бы напомнить классическое доказательство бесконечности ряда натуральных чисел:<br /><br />Предположим, что мы нашли конец, значит среди всех чисел можно найти максимальное, прибавить к нему 1 и получить новое натуральное число, которое находится за установленной нами границей. далее формулируем индукционный переход: для любого конечного множества натуральных чисел можно найти натуральное число, которое не будет входить в это множество.<br />и делаем вывод, что множество натуральных чисел не является конечным или, что то же самое, является бесконечным.<br /><br />Теперь перейдём собственно к Кантору... суть его "доказательства" сводится к следующему: пусть мы пересчитали все вещественные числа, тогда, мы можем выписать их в ряд:<br />0: 0.abc...<br />1: 0.def...<br />2: 0.ghi...<br />...<br />, а потом используя диагональный метод составить новое число, где первая цифра не равна первой цифре первого числа, вторая - второй второго и так далее.<br />Далее мы делаем финт ушами - предельный переход - и получаем число, которого нет в нашем списке, из чего делаем вывад о том, что множество вещественных чисел мощнее множества натуральных. Подумать только - одна бесконечность больше другой бесконечности на целый 1 элемент! ^_^ (Всем, кто не согласен с моими рассуждениями, советую крепко задуматься над последним предложением.)<br /><br />Что мешает нам полученное число тут же добавить, например, в начало списка? А ничего! (надеюсь все согласны, что "бесконечность+1=бесконечность"?) Да, после этого можно повторить процедуру и найти ещё одно число. Ничего не напоминает? Та же самая схема, что и в случае доказательства бесконечности множества натуральных чисел, но вот вывод из этого Кантором сделан неверный. Фактически он доказывает бесконечность множества вещественных чисел, ибо диагональный метод всего-лишь позволяет по конечному множеству вещественных чисел найти вещественное число, которое в это множество не входит (вспоминаем индукционный переход в доказательстве бесконечности ряда натуральных чисел). На бесконечном же множестве диагональный метод будет бесконечно искать, но так и не найдёт неучтённое число. Точно также мы можем прибавлять единицу бесконечное число раз в поиске последнего натурального числа, но так никогла его и не найти.Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com4tag:blogger.com,1999:blog-8221890338383304045.post-7665122787701899722007-08-19T01:15:00.000+04:002007-08-19T01:31:42.810+04:00Кодестайл против собаки- вы должны каждое слово начинать с большой буквы<br />- ну.. это ж тянуться к шифту без конца<br />- это хороший стить<br />- чем же он хорош?<br />- позволяет отделять слова друг от друга<br />- а пробелы разве не для этого?<br />- пробелы - это плохой стиль<br />- что за бред?<br />- это потенциальный источник ошибок: слова можно написать настолько близко друг к другу, что можно не заметить существование пробела, к тому же иногда межбуквенный интервал можно принять за пробел.<br />- а что мешает использовать интервалы нормальной длинны?<br />- мне лень такому дауну как ты что-либо доказывать - любой здравомыслящий человек поймёт, что пробелы нельзя использовать нигде и никогда, потому как получается говнокод - нужно использовать "синтаксический сахар" в виде заглавных букв.<br />- но это не удобно, ужасно смотрится и некоторые заглавные буквы можно спутать со строчными!<br />- бан бы тебе, с аргументом "непросветлённый"! тема закрыта.<br /><br />навеяно этим: <a href="http://phpclub.ru/talk/showthread.php?s=&threadid=101915">http://phpclub.ru/talk/showthread.php?s=&threadid=101915</a>Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com2tag:blogger.com,1999:blog-8221890338383304045.post-59226716756787094062007-08-18T07:33:00.001+04:002008-11-15T14:41:15.238+03:00мой первый шедёвр<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcsE8oHdJixiQAkYK_BEDQbL8k13WdZO5VX3QGFR8JdbU-el-tohyphenhyphenD0znyZShQWQv4n7avdY2JVALsHXFL6NlGGA6O90tfRnlfrdNuRc1atjWjjzneRk4VPSii-TYDhifFIYNq7Z3ymTr5/s1600-h/oduvanchik.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcsE8oHdJixiQAkYK_BEDQbL8k13WdZO5VX3QGFR8JdbU-el-tohyphenhyphenD0znyZShQWQv4n7avdY2JVALsHXFL6NlGGA6O90tfRnlfrdNuRc1atjWjjzneRk4VPSii-TYDhifFIYNq7Z3ymTr5/s400/oduvanchik.jpg" alt="" id="BLOGGER_PHOTO_ID_5099878529448688914" border="0" /></a>Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com0tag:blogger.com,1999:blog-8221890338383304045.post-62867922717601859882007-08-18T07:27:00.000+04:002008-11-15T14:41:15.918+03:00ume-himeвот так я стал рисовать, когда заразился анимэ ^_^ пэйнт форэва!<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNdjMcZXXgHkQUGhPbzkf8QQKiL1ZYTf0uujDIpGtcOR0e6BkFyvADX3LFOkbi5agOlNfiIGTmh6FOBm8PbcHS5OH_c2X5bOKjr6xGEXpryTZbXWFmAWx3HMl8HBo8xpOfzijmztfxCP9V/s1600-h/ume-hime4.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNdjMcZXXgHkQUGhPbzkf8QQKiL1ZYTf0uujDIpGtcOR0e6BkFyvADX3LFOkbi5agOlNfiIGTmh6FOBm8PbcHS5OH_c2X5bOKjr6xGEXpryTZbXWFmAWx3HMl8HBo8xpOfzijmztfxCP9V/s400/ume-hime4.png" alt="" id="BLOGGER_PHOTO_ID_5099877262433336578" border="0" /></a>Dark-Demonhttp://www.blogger.com/profile/06177978888851333946noreply@blogger.com0