<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>edren-baton</title>
	<atom:link href="http://edren.fatal.ru/feed" rel="self" type="application/rss+xml" />
	<link>http://edren.fatal.ru</link>
	<description>Вариант номер три</description>
	<pubDate>Tue, 23 Feb 2010 15:57:16 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Aggressive House, M.D.</title>
		<link>http://edren.fatal.ru/archives/269</link>
		<comments>http://edren.fatal.ru/archives/269#comments</comments>
		<pubDate>Tue, 23 Feb 2010 15:50:49 +0000</pubDate>
		<dc:creator>Lexa</dc:creator>
		
		<category><![CDATA[Музыка]]></category>

		<category><![CDATA[house m.d.]]></category>

		<category><![CDATA[massive attack]]></category>

		<category><![CDATA[teardrop]]></category>

		<category><![CDATA[ремикс]]></category>

		<category><![CDATA[рингтон]]></category>

		<category><![CDATA[хаус]]></category>

		<guid isPermaLink="false">http://edren.fatal.ru/?p=269</guid>
		<description><![CDATA[Продолжаю музыкальные эксперименты!
Очередной &#8220;продукт&#8221; был навеян во-первых просмотром доктора Хауса, а во-вторых необходимостью сменить рингтон на мобильнике  
Это родившийся за 15 минут коротенький ремикс на песню Teardrop от Massive Attack (это именно то, что играет во вступительных титрах к Хаусу). Сделано, как обычно, наспех в Reason.

Скачать mp3 - Агрессивный доктор Хаус

]]></description>
			<content:encoded><![CDATA[<p>Продолжаю музыкальные эксперименты!</p>
<p>Очередной &#8220;продукт&#8221; был навеян во-первых просмотром доктора Хауса, а во-вторых необходимостью сменить рингтон на мобильнике <img src='http://edren.fatal.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Это родившийся за 15 минут коротенький ремикс на песню Teardrop от Massive Attack (это именно то, что играет во вступительных титрах к Хаусу). Сделано, как обычно, наспех в Reason.</p>
<p><span style="font-size: 140%"><br />
<a href="/storage/aggressive-house.mp3.zip">Скачать mp3 - Агрессивный доктор Хаус</a><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://edren.fatal.ru/archives/269/feed</wfw:commentRss>
		</item>
		<item>
		<title>Captcha - как искажать картинку?</title>
		<link>http://edren.fatal.ru/archives/267</link>
		<comments>http://edren.fatal.ru/archives/267#comments</comments>
		<pubDate>Sun, 31 Jan 2010 17:33:11 +0000</pubDate>
		<dc:creator>Lexa</dc:creator>
		
		<category><![CDATA[Без рубрики]]></category>

		<category><![CDATA[captcha]]></category>

		<category><![CDATA[алгоритм]]></category>

		<category><![CDATA[искажение]]></category>

		<guid isPermaLink="false">http://edren.fatal.ru/?p=267</guid>
		<description><![CDATA[Капчу видели все. В интернете тут и там предлагают ввести &#8220;буквы, изображенные на картинке&#8221;. В данной статье под капчей будут пониматься именно искаженные буковки. Хотя на самом деле за аббревиатурой скрывается куда более жестокий смысл: полностью автоматизированный публичный тест Тьюринга для различия компьютеров и людей (ПАПТТРКЛ, короче говоря).
Чтобы робот не смог распознать слово на картинке, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://ru.wikipedia.org/wiki/CAPTCHA">Капчу</a> видели все. В интернете тут и там предлагают ввести &#8220;буквы, изображенные на картинке&#8221;. В данной статье под капчей будут пониматься именно искаженные буковки. Хотя на самом деле за аббревиатурой скрывается куда более жестокий смысл: полностью автоматизированный публичный тест Тьюринга для различия компьютеров и людей (ПАПТТРКЛ, короче говоря).</p>
<p>Чтобы робот не смог распознать слово на картинке, применяют разные приемы. Один очень эффективный прием - это склейка букв (в этой статье рассматриваться не будет). Другой прием - это геометрическое искажение изображения. Про него-то я и хотел поговорить.<br />
<span id="more-267"></span></p>
<p>Итак, я надел очки и принял умный вид.</p>
<p>Искажение изображения - это применение к нему преобразования. Наиболее естественными выглядят преобразование типа масшабирования и сдвига:</p>
<p><code>x' = a<sub>1</sub>x + b<sub>1</sub><br />
y&#8217; = a<sub>2</sub>y + b<sub>2</sub><br />
</code></p>
<p>Тут <code>a<sub>i</sub></code> - коэффициенты масштаба, <code>b<sub>i</sub></code> - коэффициенты сдвига. Заметно, что координаты остаются независимыми. Если ввести линейную зависимость координат друг от друга, то можно добиться эффектов вроде поворота и перспективы. Но ни одно из этих преобразований не исказит картинку так, чтобы она стала искаженной. <img src='http://edren.fatal.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Тупой ввод нелинейных зависимостей порождает неописуемою и неуправляемую <s>хрень</s> неразбериху.</p>
<p>Выход из ситуации - вместо коэффициентов в уравнениях выше использовать функции от второй координаты. Физически это будет значить, что масштабирование и сдвиг в каждом столбце картинки будет зависеть от строки. И наоборот (в смысле, если слова &#8220;строка&#8221; и &#8220;столбец&#8221; поменять местами).</p>
<p>Очень важно подойти ответственно к выбору функций. Во-первых, функция должна быть гладкой. Применение негладкой функции даст негладкое изображение. Вот пример, когда гладкость математическая (то есть существование первой производной) соответствует гладкости бытовой (приятной глазу). Так что тупо random() не подойдет. </p>
<p>Во-вторых, функция должна быть ограничена на интервале, на котором мы ее применяем. Это естественное требование, нужное для того, чтобы не выскочить за границы изображения. </p>
<p>Почти хороший вариант - это синус. Он и гладкий, и ограниченный. Но вместе с тем он еще такой банальный, что тошнит.</p>
<p>После того, как я немного подумал, на ум пришел способ построения этих функций, похожий на построение <a href="http://ru.wikipedia.org/wiki/%D0%9A%D1%83%D0%B1%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D1%81%D0%BF%D0%BB%D0%B0%D0%B9%D0%BD">полиномиальных сплайнов</a>. Состоит он в следующем:</p>
<ol>
<li>На интересующем нас отрезке выбираются случайно N точек, в которых значение функции генерируется случайно в допустимом диапазоне</li>
<li>В промежуточных точках интервала <code>[x<sub>i</sub>, x<sub>i+1</sub>]</code> функция будет полиномом 3 степени <code>S<sub>i</sub>(x) = a<sub>i</sub>x<sup>3</sup> + b<sub>i</sub>x<sup>2</sup> + c<sub>i</sub>x + d<sub>i</sub></code></li>
<li>Условия непрерывности запишутся как <code>S<sub>i</sub>(x<sub>i+1</sub>) = S<sub>i+1</sub>(x<sub>i+1</sub>) = y<sub>i+1</sub></code></li>
<li>Условия гладкости и ограниченности я выбрал очень хитро: <code>S'(x<sub>i</sub>) = S&#8217;(x<sub>i+1</sub>) = 0</code></li>
</ol>
<p>Последнее условие дает нам очень много. В нем, можно сказать, весь сок. Равенство значений производных означает гладкость на стыках. Равенство их нулю означает, что в эти точках кубический полином имеет либо глобальный экстремум, либо перегиб. Таких точек не может быть больше двух, т.к. квадратное уравнение (получающееся в ходе анализа на экстремум) имеет не более двух корней. Это означает монотонность на интервале, откуда непосредственно следует ограниченность значениями на его концах. </p>
<p>А еще, простота этих условий дает возможность вычислить 4 коэффициента полинома для каждого интервала независимо! Четыре уравнения для определения 4 неизвестных:</p>
<p><code>S(x<sub>i</sub>) = y<sub>i</sub><br />
S(x<sub>i+1</sub>) = y<sub>i+1</sub><br />
S&#8217;(x<sub>i</sub>) = 0<br />
S&#8217;(x<sub>i+1</sub>) = 0<br />
</code></p>
<p>Maple дает решение:</p>
<div style="text-align:center">
<img src=/storage/captcha1.png />
</div>
<p>Теперь можно поглядеть, как будут выглядеть такие функции. Построим кривую по 4 точкам <code>[2, 4], [6, 6], [8, 1], [12, -1]</code>:</p>
<div style="text-align:center">
<img src=/storage/captcha2.png /><br />
<img src=/storage/captcha3.png />
</div>
<p>Получилась довольно замысловатая загогулина, которую просто так и не придумаешь.</p>
<p>Теперь я попробую применить такие кривые для искажения &#8220;капч&#8221;. Я сгенерирую 4 кривых и буду их использовать для вычисления масштабных и сдвиговых коэффициентов в уравнениях, с которых я начал вас грузить. </p>
<p>Получилось вот это:</p>
<div style="text-align:center">
<img src=/storage/captcha4.png /></p>
<p><img src=/storage/captcha5.png />
</div>
<p>Тот самый эффект развевающегося флага, к которому все привыкли!</p>
<p>Кому интересно, предлагаю скачать <a href="/storage/Lexa.Lab.Captcha.zip">исходники</a>. После запуска программы, можно нажимать любую кнопку для генерации изображения с новыми кривыми. Кстати, в программке используется билинейный фильтр, про который я говорил прошлый раз <img src='http://edren.fatal.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>P.S. Иногда картинка получается не очень искаженной. Происходит это из-за того, что иногда кривые получаются не очень кривыми. <img src='http://edren.fatal.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> То есть опорные точки надо выбирать все-таки не совсем случайно, а из каких-то условий, обеспечивающих нужную кривизну&#8230; Но искать эти условия мне уже лень.</p>
]]></content:encoded>
			<wfw:commentRss>http://edren.fatal.ru/archives/267/feed</wfw:commentRss>
		</item>
		<item>
		<title>Про сэмплирование, квантование, фильтры и интерполяцию</title>
		<link>http://edren.fatal.ru/archives/266</link>
		<comments>http://edren.fatal.ru/archives/266#comments</comments>
		<pubDate>Fri, 29 Jan 2010 21:06:32 +0000</pubDate>
		<dc:creator>Lexa</dc:creator>
		
		<category><![CDATA[Без рубрики]]></category>

		<category><![CDATA[sampling]]></category>

		<category><![CDATA[дискретизация]]></category>

		<category><![CDATA[интерполяция]]></category>

		<category><![CDATA[квантование]]></category>

		<category><![CDATA[сигналы]]></category>

		<category><![CDATA[фильтры]]></category>

		<guid isPermaLink="false">http://edren.fatal.ru/?p=266</guid>
		<description><![CDATA[Я решил написать заметку со столь чудовищным названием после того, как на работе разгорелась нешуточная дискуссия про сглаживание изображений. Хотелось бы поведать миру, что я для себя усвоил в течение нескольких лет работы со звуком, изображениями и даже написания в 2005 работы по вейвлетному сжатию изображений.

Первым делом было бы неплохо разобраться в вынесенных в заголовок [...]]]></description>
			<content:encoded><![CDATA[<p>Я решил написать заметку со столь чудовищным названием после того, как на работе разгорелась нешуточная дискуссия про сглаживание изображений. Хотелось бы поведать миру, что я для себя усвоил в течение нескольких лет работы со звуком, изображениями и даже написания в 2005 работы по вейвлетному сжатию изображений.<br />
<span id="more-266"></span></p>
<p>Первым делом было бы неплохо разобраться в вынесенных в заголовок словах.</p>
<p><em>Сэмплирование</em> (sampling, дискретизация) - это такой процесс, во время которого в определенных точках пространства-времени (отсчетах) происходят <em>измерения</em> (samples, выборки) некоторой величины. Например, раз в день человек взвешивается на весах. Или несколько тысяч раз в секунду микрофон снимает амплитуду звука. </p>
<p><em>Квантование</em> (quantization) - это прием, делающий из непрерывного (и, может быть, бесконечного) диапазона значений конечный набор интервалов.<br />
Делается это обычно с тем, чтобы некоторое значение упаковать в некоторое количество бит. Например, можно квантовать расстояние интервалами по 1 см. И тогда в unsigned byte можно с уверенностью записать рост человека. Или разбить диапазон яркости от совсем черного до совсем белого на 256 уровней. Квантование может быть разным: равномерным, неравномерным, табличным, еще каким-то.</p>
<p>Дискретизация плюс квантование дают нам <em>оцифровку</em>. Например, сэмплируя 44100 раз в секунду и квантуя на 64K уровней амплитуду оцифровывается звук с качеством CD. Сэмплируя 300 раз на 1 дюйм и квантуя яркость на 256 уровней оцифровывается черно-белое изображение. Если последнее делать 25 раз в секунду и параллельно делать первое, то получится черно-белый фильм офигенного разрешения.</p>
<p>В результате оцифровки получаем цифровой <em>сигнал</em> - серию квантованых измерений.</p>
<p>С оцифровкой есть три проблемы. Во-первых, нужны точные часы (иначе будет <a href="http://ru.wikipedia.org/wiki/%D0%94%D0%B6%D0%B8%D1%82%D1%82%D0%B5%D1%80">джиттер</a>). Во-вторых, нужны точные инструменты для измерений: хорошие микрофоны, хорошие матрицы для цифровиков и даже какие-то хитрые <a href="http://www.google.ru/search?q=%D1%82%D1%83%D0%BB%D0%B3%D1%83+%D0%BC%D0%B0%D1%80%D1%82%D1%8B%D0%BD%D0%BE%D0%B2+%D0%B7%D0%B5%D0%BC%D0%BB%D0%B5%D1%82%D1%80%D1%8F%D1%81%D0%B5%D0%BD%D0%B8%D1%8F">бочки для измерения землетрясений</a>. В-третьих, нужны технические средства для воспроизведения оцифрованного сигнала: хорошие звуковые карты, мониторы с правильной цветопередачей, а также супер-меломанские колонки. С этими проблемами хорошо уживаются обычные люди, но от них сильно страдают любители <a href="http://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%BC%D0%BF%D0%BE%D0%B2%D1%8B%D0%B9_%D0%B7%D0%B2%D1%83%D0%BA">теплого лампового</a>, маньяки-фотографы и прочие профессионалы.</p>
<p>Эти проблемы еще называют словом <em>aliasing</em> (элайзинг, алиасинг), или в простонародье &#8220;потеря качества&#8221;. В общем смысле, элайзинг означает наличие в  воспроизведенном сигнале информации, которой в оригинальном сигнале не было. Это и мозаичное видео на DVD с 8 фильмами на одном диске, и металлическое звучание аудио, оцифрованного с низкой частотой дискретизации/битностью, и эффект муара при уменьшении картинок. И даже известный всем эффект, когда быстро вращающееся колесо кажется медленно крутящимся в обратную сторону - это тоже элайзинг, возникающий оттого, что наш мозг неправильно выбирает частоту сэмплирования при просмотре колеса.</p>
<p>Существует еще такое понятие как <em>ресэмплинг</em> (resampling, передискретизация). Он (она) возникает, когда для каких-то нужд надо изменить частоту дискретизации. Банальный пример - это изменение разрешения изображения или уменьшение частоты дискретизации аудио, чтобы занимало меньше места.</p>
<p>Но есть и менее банальные примеры, которые не очевидны. </p>
<p>Возьмем практическую задачу: применить к изображению преобразование. В общем случае преобразование изображения описывается какими-то правилами, по которым цвета точек результирующего изображения можно получить из цветов исходного.</p>
<p>Например, это преобразование даст картинку, повернутую на 45 градусов и увеличенную примерно в 4 раза (по площади):</p>
<p><code>x' = (x - y) / 3<br />
y' = (x + y) / 3</code></p>
<p><img src=/storage/man.png alt="Красноглазик до преобразования" /></p>
<p>превращается в:</p>
<p><img src=/storage/man-x-bad.png alt="Красноглазик мозаичный" /></p>
<p>На преобразованном изображении явно заметен элайзинг - пикселизация. Почему?</p>
<p>Для вычисления цвета пикселя в итоговом изображении в точке <code>(30, 20)</code> я применил записанные выше уравнения и узнал, что надо взять цвет исходного изображения в точке <code>(10/3, 50/3)</code>. Но поскольку никаких дробных частей от пикселя взять невозможно, я взял цвет в точке, которая получилсь при отбросе дробной части - <code>(3, 16)</code>, внеся тем самым в итоговое изображение паразитную информацию.</p>
<p>А как же узнать, какой цвет сидит в точке <code>(10/3, 50/3)</code>? </p>
<p>Можно поступить так: увеличить исходное изображение в 100 раз и посмотреть, какой цвет сидит по координатам <code>(33, 167)</code>. Так мы получим более аккуратное значение. Но увеличение изображения это опять-таки преобразование над ним, выглядещее как</p>
<p><code>x' = x / 10<br />
y' = y / 10</code></p>
<p>И мы снова получаем ту же свинью: не зная цвета в точке <code>(3/10, 3/10)</code>, я возьму цвет в точке <code>(0, 0)</code> и получу мозайку. </p>
<p>Продолжать стратегию смысла не имеет. Нет у нас в оцифрованном сигнале информации о его значениях на разрешении, превосходящем половину частоты дискретизации! Это <a href="http://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9A%D0%BE%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2%D0%B0">теорема Котельникова-Найквиста</a>. Остается делать предположения об этих значениях. Округление к меньшему целому является таким предположением, достаточно примитивным и порождающим элайзинг в виде мозайки. </p>
<p>Но есть и другие способы догадаться о значениях сигнала на основании ближайших соседей несуществующго в сигнале отсчета. Называется это интерполяцией. А отбор соседних отсчетов происходит с помощью так называемой оконной функции, или фильтра.</p>
<p>Один из самых простых фильтров - линейный. В этом фильтре для определения значения в промежуточной точке сигнала используются линейная комбинация значений ближайших отсчетов с весами равными удалению до этих соседей.</p>
<p>Например, если в точке <code>2</code> одномерный сигнал имеет значение <code>7</code>, а в точке <code>3</code> - значение <code>5</code>, тогда в точке <code>2.7</code> предполагаемое значение равно <code>0.3 * 7 + 0.7 * 5 = 5.6</code>.</p>
<p>Изображение - это двумерный сигнал, поэтому для него надо применять <a href="http://ru.wikipedia.org/wiki/%D0%91%D0%B8%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F_%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%B0%D1%86%D0%B8%D1%8F">билинейную фильтрацию</a>, соответственно по четырем точкам. С ней изображение становится гораздо более ровным:</p>
<p><img src=/storage/man-x-bilin.png alt="Красноглазик билинейный" /></p>
<p>Такой фильтр еще называют triangle filter или cone filter. Кроме него существует масса других: квадратичный, кубический, фильтры основанные на распределении Гаусса, фильтры основанные на функции Sinc (Mitchell, Lanczos). Я нашел <a href="http://wiki.panotools.org/PanoTools_Anti_Aliasing_Filters">страничку</a>, на которой собрано много фильтров с их графиками.</p>
<p>Выбирать фильтр надо в зависимости от изображения и требований к производительности (бла-бла).</p>
<p>А теперь ответ на главный вопрос, ради чего я сел за эту статью: какая связь между фильтром и передискретизацией?</p>
<p>Передискретизацию можно делать без фильтра, но будет некрасиво. Чтобы было красиво, применяют фильтры. Но для получения значения сигнала в точке между отсчетами (то есть как бы при увеличенной частоте дискретизации) не обязательно делать ресэмплинг, можно сразу использовать фильтр.</p>
<p>Ваня, понятно?</p>
]]></content:encoded>
			<wfw:commentRss>http://edren.fatal.ru/archives/266/feed</wfw:commentRss>
		</item>
		<item>
		<title>Все про песню &#8220;Ужасно интересно&#8221; - ноты, слова, минусовка, MIDI</title>
		<link>http://edren.fatal.ru/archives/265</link>
		<comments>http://edren.fatal.ru/archives/265#comments</comments>
		<pubDate>Sat, 23 Jan 2010 20:14:02 +0000</pubDate>
		<dc:creator>Lexa</dc:creator>
		
		<category><![CDATA[Музыка]]></category>

		<category><![CDATA[38 попугаев]]></category>

		<category><![CDATA[midi]]></category>

		<category><![CDATA[минусовка]]></category>

		<category><![CDATA[мультфильм]]></category>

		<category><![CDATA[ноты]]></category>

		<category><![CDATA[песня]]></category>

		<guid isPermaLink="false">http://edren.fatal.ru/?p=265</guid>
		<description><![CDATA[Не смог найти в сети ноты песни из мультика &#8220;38 попугаев&#8221;. Пришлось снять самому. Вот что получилось:

Скачать: Минусовку (mp3), MIDI, слова

]]></description>
			<content:encoded><![CDATA[<p>Не смог найти в сети ноты песни из мультика &#8220;38 попугаев&#8221;. Пришлось снять самому. Вот что получилось:</p>
<p><span style="font-size: 170%"><br />
Скачать: <a href="/storage/38popugaev.mp3.zip">Минусовку (mp3)</a>, <a href="/storage/38popugaev.mid">MIDI</a>, <a href="/storage/38popugaev.html">слова</a><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://edren.fatal.ru/archives/265/feed</wfw:commentRss>
		</item>
		<item>
		<title>Теперь можно писать jQuery-код на C#</title>
		<link>http://edren.fatal.ru/archives/260</link>
		<comments>http://edren.fatal.ru/archives/260#comments</comments>
		<pubDate>Sun, 25 Oct 2009 15:32:09 +0000</pubDate>
		<dc:creator>Lexa</dc:creator>
		
		<category><![CDATA[Без рубрики]]></category>

		<guid isPermaLink="false">http://edren.fatal.ru/?p=260</guid>
		<description><![CDATA[И это не шутка и не бред.
Сегодня я закончил достаточно трудоемкую задачу - доделал jQuery-враппер в Lexa.Jsm.CoreLibrary. О том, что такое Lexa.Jsm, можно узнать из этой статьи. 
Заодно накидал несложный пример и поместил его в Misc/jQueryDemo. В процессе его билдежки из C#-ного исходника App.cs получается вот такой милый скрипт:
app.js
JSM.ensureNamespace('jQueryDemo');

var _ = jQueryDemo.App = {
};

_.DomReady = [...]]]></description>
			<content:encoded><![CDATA[<p>И это не шутка и не бред.</p>
<p>Сегодня я закончил достаточно трудоемкую задачу - доделал jQuery-враппер в Lexa.Jsm.CoreLibrary. О том, что такое Lexa.Jsm, можно <a href="/jsm">узнать из этой статьи</a>. </p>
<p>Заодно накидал несложный пример и поместил его в <a href="http://code.google.com/p/lexa-jsm/source/browse/trunk/Misc/jQueryDemo">Misc/jQueryDemo</a>. В процессе его билдежки из C#-ного исходника <a href="http://code.google.com/p/lexa-jsm/source/browse/trunk/Misc/jQueryDemo/App.cs">App.cs</a> получается вот такой милый скрипт:</p>
<p><b>app.js</b></p>
<pre><code class="js">JSM.ensureNamespace('jQueryDemo');

var _ = jQueryDemo.App = {
};

_.DomReady = function() {
  $(document.body).css({ margin: 0, padding: 0 });
  var div = $('&lt;div&gt;&lt;/div&gt;').text('Hey, it\'s fun to write jQuery code in C# :)').css({ background: 'orange', font: '16pt Tahoma', padding: '8px 16px' }).fadeIn(400).appendTo(document.body);
  var button = $('&lt;input&gt;');
  button.attr('type', 'button').val('Click here to hide orange bar').one('click', function(e) { return div.slideUp('slow', function() {
    button.attr('disabled', true);
    window.alert('No more orange bars!');
  }) });
  document.body.appendChild(button.get(0));
}

_.Run = function() {
  $(jQueryDemo.App.DomReady);
}

_ = JSM.registerType;
delete _;
</code></pre>
<p>По крайней мере, таким он получается сегодня. Кто знает, чего я натворю в Jsm-компиляторе в будущем <img src='http://edren.fatal.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Кстати, обертка для jQuery снабжена документацией, а значит jQuery-код писать теперь гораздо легче. Взгляните:</p>
<p><img src="http://edren.fatal.ru/wp-content/uploads/2009/10/jsm-jquery-1.png" alt="Редактирование исходника в Visual Studio 2008" title="Редактирование исходника в Visual Studio 2008" width="513" height="266" class="aligncenter size-full wp-image-262" /></p>
<p>Тут и intellisense, и подсказка по параметрам, и проверка синтаксиса и типов as you type, и Go to definition с Find all references. Писать приходится немножко больше, но происходит это теперь быстрее. </p>
<p>Еще есть несколько особенностей.</p>
<p>Во-первых, имеются некоторые названия, которых, строго говоря, в jQuery нету. Напрмер, <a href="http://code.google.com/p/lexa-jsm/source/browse/trunk/Lexa.Jsm.CoreLibrary/jQuery/jQuery.AjaxOptions.cs">jQuery.AjaxOptions</a> или <a href="http://code.google.com/p/lexa-jsm/source/browse/trunk/Lexa.Jsm.CoreLibrary/jQuery/jQuery.AnimationOptions.cs">jQuery.AnimationOptions</a>. Они облегчают написание кода и в то же время не создают дополнительного выхлопа, то есть компилируются в обычные JavaScript-объекты.</p>
<p>Во-вторых, вместо <code>$(...)</code> или <code>$.each</code> следует писать соответственно <code>new jQuery(...)</code> и <code>jQuery.each</code>, однако компилируется это в свои короткие аналоги.</p>
<p>В-третьих, в jQuery часто используется <code>this</code> внутри callback-функций. Совершенно понятно, что в C# никаких фокусов c <code>this</code> не бывает. Чтобы не потерять функционала, я ввел три дополнительных метода: </p>
<ul>
<li><code>DomElement jQuery.<strong>thisElement</strong>()</code></li>
<li><code>T jQuery.<strong>thisObj</strong>&lt;T&gt;()</code></li>
<li><code>jQuery jQuery.<strong>thisWrapper</strong>()</code></li>
</ul>
<p>Первые два компилируются в просто <code>this</code>, третий - в <code>$(this)</code>. Правда, следует иметь в виду, что в анонимных функциях настоящий <code>this</code> при использовании этих методов употреблять нельзя - будет создано дополнительное замыкание, и <code>this</code> испортится.</p>
<p>Теперь думаю, может показать это <a href="http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B7%D0%B8%D0%B3,_%D0%94%D0%B6%D0%BE%D0%BD">Резигу</a>?</p>
]]></content:encoded>
			<wfw:commentRss>http://edren.fatal.ru/archives/260/feed</wfw:commentRss>
		</item>
		<item>
		<title>Про конвертацию C# в JavaScript</title>
		<link>http://edren.fatal.ru/archives/259</link>
		<comments>http://edren.fatal.ru/archives/259#comments</comments>
		<pubDate>Sun, 04 Oct 2009 13:53:55 +0000</pubDate>
		<dc:creator>Lexa</dc:creator>
		
		<category><![CDATA[Сугубо техническое]]></category>

		<category><![CDATA[c#]]></category>

		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://edren.fatal.ru/?p=259</guid>
		<description><![CDATA[Наконец-то опубликовал статью о преобразовании C# в JavaScript. Несказанно рад, потому что проект отнимал много времени, и хотелось его уже бросить. Но я стараюсь доделывать начатое до конца, и это мне в очередной раз удалось.
]]></description>
			<content:encoded><![CDATA[<p>Наконец-то опубликовал <a href="/jsm">статью</a> о преобразовании C# в JavaScript. Несказанно рад, потому что проект отнимал много времени, и хотелось его уже бросить. Но я стараюсь доделывать начатое до конца, и это мне в очередной раз удалось.</p>
]]></content:encoded>
			<wfw:commentRss>http://edren.fatal.ru/archives/259/feed</wfw:commentRss>
		</item>
		<item>
		<title>Jeeves and Wooster theme guitar tab</title>
		<link>http://edren.fatal.ru/archives/254</link>
		<comments>http://edren.fatal.ru/archives/254#comments</comments>
		<pubDate>Thu, 24 Sep 2009 17:02:12 +0000</pubDate>
		<dc:creator>Lexa</dc:creator>
		
		<category><![CDATA[Музыка]]></category>

		<category><![CDATA[guitar]]></category>

		<category><![CDATA[music]]></category>

		<category><![CDATA[tab]]></category>

		<guid isPermaLink="false">http://edren.fatal.ru/?p=254</guid>
		<description><![CDATA[I&#8217;ve been asked at youtube to share a tab for Jeeves and Wooster theme played by me on acoustic guitar. Here it is.
Выложил табу темы из Дживса и Вустера, как ее играю я.

Download: PDF, MIDI, GP5

]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been asked at youtube to share a tab for <a href="http://www.youtube.com/watch?v=2KhhC3OXeYE">Jeeves and Wooster theme played by me on acoustic guitar</a>. Here it is.</p>
<p>Выложил табу темы из Дживса и Вустера, как ее <a href="http://www.youtube.com/watch?v=2KhhC3OXeYE">играю я</a>.</p>
<p><span style="font-size: 170%"><br />
Download: <a href="/storage/jeeves.pdf">PDF</a>, <a href="/storage/jeeves.mid">MIDI</a>, <a href="/storage/jeeves.gp5">GP5</a><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://edren.fatal.ru/archives/254/feed</wfw:commentRss>
		</item>
		<item>
		<title>Немного автобиографии</title>
		<link>http://edren.fatal.ru/archives/252</link>
		<comments>http://edren.fatal.ru/archives/252#comments</comments>
		<pubDate>Wed, 09 Sep 2009 17:58:46 +0000</pubDate>
		<dc:creator>Lexa</dc:creator>
		
		<category><![CDATA[Без рубрики]]></category>

		<guid isPermaLink="false">http://edren.fatal.ru/?p=252</guid>
		<description><![CDATA[Попалась на глаза фотка:

Склоняюсь к тому, что изображен январь 1997 года. Новогодний интерьер органично дополняют: некий вариант спектрума, подключенный к телеку длинным шнуром (стелется по полу), магнитофон для записи и считывания программ (торчит внизу ближе к левому краю) и собственно я.
Кто в курсе, поймет всю тонкую ауру этой картины. Кто не в курсе, объяснять бесполезно [...]]]></description>
			<content:encoded><![CDATA[<p>Попалась на глаза фотка:</p>
<p><img src="http://edren.fatal.ru/wp-content/uploads/2009/09/zx.jpg" alt="Маленький Леша и ZX Spectrum" title="Маленький Леша и ZX Spectrum" width="600" height="450" class="aligncenter size-full wp-image-253" /></p>
<p>Склоняюсь к тому, что изображен январь 1997 года. Новогодний интерьер органично дополняют: некий вариант <a href="http://ru.wikipedia.org/wiki/ZX_Spectrum">спектрума</a>, подключенный к телеку длинным шнуром (стелется по полу), магнитофон для записи и считывания программ (торчит внизу ближе к левому краю) и собственно я.</p>
<p>Кто в курсе, поймет всю тонкую ауру этой картины. Кто не в курсе, объяснять бесполезно <img src='http://edren.fatal.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://edren.fatal.ru/archives/252/feed</wfw:commentRss>
		</item>
		<item>
		<title>Выложился на YouTube</title>
		<link>http://edren.fatal.ru/archives/251</link>
		<comments>http://edren.fatal.ru/archives/251#comments</comments>
		<pubDate>Sat, 29 Aug 2009 18:27:33 +0000</pubDate>
		<dc:creator>Lexa</dc:creator>
		
		<category><![CDATA[Музыка]]></category>

		<category><![CDATA[guitar]]></category>

		<category><![CDATA[music]]></category>

		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://edren.fatal.ru/?p=251</guid>
		<description><![CDATA[Наконец-то дошли руки сделать то, что мне советовали: снял на видео как я играю на гитаре и вывесил в мировой доступ:
1. Del Shannon&#8217;s Runaway
2. Hello Dolly
3. Тема из Дживса и Вустера
4. Corcovado (Jobim)
5. Tears (Django)
Это потрепанная гитара, на которой я учился играть в 1998 году.
]]></description>
			<content:encoded><![CDATA[<p>Наконец-то дошли руки сделать то, что мне советовали: снял на видео как я играю на гитаре и вывесил в мировой доступ:</p>
<p>1. <a href="http://www.youtube.com/watch?v=Kq0l7tQHlQU">Del Shannon&#8217;s Runaway</a><br />
2. <a href="http://www.youtube.com/watch?v=BVvJN9gdGvU">Hello Dolly</a><br />
3. <a href="http://www.youtube.com/watch?v=2KhhC3OXeYE">Тема из Дживса и Вустера</a><br />
4. <a href="http://www.youtube.com/watch?v=fHoeDmvOyDA">Corcovado (Jobim)</a><br />
5. <a href="http://www.youtube.com/watch?v=j8VZk0gzqQg">Tears (Django)</a></p>
<p>Это потрепанная гитара, на которой я учился играть в 1998 году.</p>
]]></content:encoded>
			<wfw:commentRss>http://edren.fatal.ru/archives/251/feed</wfw:commentRss>
		</item>
		<item>
		<title>J2ME Twitter Client своими руками</title>
		<link>http://edren.fatal.ru/archives/250</link>
		<comments>http://edren.fatal.ru/archives/250#comments</comments>
		<pubDate>Mon, 24 Aug 2009 09:13:25 +0000</pubDate>
		<dc:creator>Lexa</dc:creator>
		
		<category><![CDATA[Сугубо техническое]]></category>

		<category><![CDATA[j2me]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[midp]]></category>

		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://edren.fatal.ru/?p=250</guid>
		<description><![CDATA[На выходных была такая плохая погода, и было такое ужасное настроение, что я решил заняться программированием. Эта деятельность успокаивает. Компьютер, как правило, тебя слушается. На него можно поорать, и он не будет обижаться. В конце концов, становится хорошо от того, что ты что-то создаешь.
Предыстория такая. Пару недель назад я захотел найти себе Twitter-клиент на телефон. [...]]]></description>
			<content:encoded><![CDATA[<p>На выходных была такая плохая погода, и было такое ужасное настроение, что я решил заняться программированием. Эта деятельность успокаивает. Компьютер, как правило, тебя слушается. На него можно поорать, и он не будет обижаться. В конце концов, становится хорошо от того, что ты что-то создаешь.</p>
<p>Предыстория такая. Пару недель назад я захотел найти себе Twitter-клиент на телефон. Телефон у меня не смартфон, а очень обычный (Nokia 6500). Но мне нравится, потому что он тонкий и маленький.</p>
<p>Нормального MIDP-клиента я не нашел. Под нормальным я понимаю клиент, который мог бы загружать фотки на twitpic или подобный сервис. Я нашел только <a href="http://www.substanceofcode.com/software/mobile-twitter-client-twim/">Twim</a>, но он имел проблемы с кодировкой и в самый нужный момент просто перестал работать.</p>
<p>Поэтому я решил написать клиент для себя, а заодно попробовать Java ME в принципе. </p>
<p>Проект лежит в открытом доступе на <a href="http://code.google.com/p/lexa-my-twitter/">http://code.google.com/p/lexa-my-twitter/</a>. Данная поделка умеет обновлять статус, загружать фотки с камеры на twitpic и читать friends timeline. В принципе, это все что нужно лично мне. Работа с камерой была заточена под Nokia (в частности, локатор capture://image вместо capture://video).</p>
<p>Впечатления от Java ME спорные. С одной стороны, прикольно написать программку для телефона. С другой - API бедновато. Нету очевидных вещей вроде url encode, base64 encode, не говоря уже об XML-парсерах. Разочаровала также не-кроссплатформенность API для камер.</p>
]]></content:encoded>
			<wfw:commentRss>http://edren.fatal.ru/archives/250/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
