ash’s blog / все про fun

Google buzz video

compare, fun, google, buzz, it — 9 февраля 2010

Альфаблок

Через три дня после блокирования моей карты Альфа-банк прислал-таки смску: Uvazhaemyj klient ALFA-BANKA!V svjazi s komprometaciej Vasha karta 5*45 budet perevypushena i dostavlena v Vashe otdelenie Banka v techenie 2 nedel.

banks, fun, travel, posterr — 1 февраля 2010

Snowman

Открыл чудесный unicodesnowmanforyou.com во всех браузерах, что были под рукой :-)

fun, internet, unicode, browser — 24 декабря 2009

На фоне Сапсана

После тестирования скростного «Сапсана», который едет из Москвы в Питер за три часа 45 минут, весьма нелепо смотрится реклама ноутбука с аккумулятором, способным работать 9 часов, в рекламе которого емкость аккумулятора иллюстрируют расстоянием от Москвы до Питера.

fun, advert, sapsan — 19 декабря 2009

Своя формула

Яндекс не разглашает своих алгоритмов ранжинования записей в блогах в их рейтинге.

Надо дать возможность каждому подобрать свою секретную формулу:

fun, interface, whoyougle — 6 ноября 2009

Незваным гостем вы себя почуствуете

Чешские авиалинии учудили с переводом названия своей промо-акции.

fun, air, ru — 7 сентября 2009

Остановка

Москва, Новинский бульвар. 2 сентября.

fun, cool, outer, moscow — 3 сентября 2009

Jacob und Wilhelm Grimm

Вчера читал ребенку сказку про Рапунцель.

Сегодня читаем про Румпельштильцхен.

child, literature, fun — 20 августа 2009

Вычисление синуса в XSLT

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

Если не подключать никаких расширений, то в базовом комплекте XSLT (а точнее, XPath) не имет в наборе тригонометрических функций. Доступна лишь арифметика: сложить, умножить, разделить, получить остаток — которой, впрочем, достаточно и для того, чтобы вычислить синус и косинус. Мой шаблон для вычисления синуса состоит ровно из ста строк (включая пустые). Это, конечно не три символа для вызова функции sin в любом языке программирования: здесь интерес представляет сам процесс.

Значение синуса для данного x вычислить относительно просто, воспользовавшись разложением в степенной ряд:

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

Тестировать правильность вычисления я буду на двух величинах: sin(π) и sin(π/2). Соответственно, результатом должны быть ноль и единица.

Исходные данные записаны в XML:

<?xml version="1.0"?>
<math>
    <sin x="3.1415926535898"/>
    <sin x="1.5707963267949"/>
</math>

Глядя на формулу вычисления синуса, сразу становится понятным, что потребуются рекурсивные вызовы в XSLT. Чуть позже понимаешь, что рекурсия нужна не только для подсчета суммы, но и для вычисления факториала, и для возведения в степень.

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

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text"/>

<xsl:template match="//sin">
    <xsl:text>sin(</xsl:text>
    <xsl:value-of select="@x"/>
    <xsl:text>) = </xsl:text>   
   
    <xsl:call-template name="sin-row">
        <xsl:with-param name="x" select="@x"/>
        <xsl:with-param name="N" select="10"/>
    </xsl:call-template>
   
    <xsl:text>&#10;</xsl:text>
</xsl:template>

Именованный шаблон sin-row (который и вычисляет синус) получает на входе переменную x и число слагаемых в ряду, которые я хочу учитывать. Чем больше слагаемых, тем больше точность и дольше вычисления.

<xsl:template name="sin-row">
    <xsl:param name="x"/>
    <xsl:param name="n" select="0"/>
    <xsl:param name="N" select="5"/>
    <xsl:param name="sin" select="0"/>

Внутри sin-row вычисляются промежуточные значения — множители, участвующие в вычислении очередного слагаемого: p1 — это степень –1, p2 — нечетная степень x, fact — факториал в знаменателе.

    <xsl:variable name="p1">
        <xsl:call-template name="power">
            <xsl:with-param name="x" select="-1"/>
            <xsl:with-param name="n" select="$n"/>
        </xsl:call-template>
    </xsl:variable>

    <xsl:variable name="p2">
        <xsl:call-template name="power">
            <xsl:with-param name="x" select="$x"/>
            <xsl:with-param name="n" select="2 * $n + 1"/>
        </xsl:call-template>
    </xsl:variable>

    <xsl:variable name="fact">
        <xsl:call-template name="factorial">
            <xsl:with-param name="n" select="2 * $n + 1"/>
        </xsl:call-template>
    </xsl:variable>

Результат суммируется с величиной, полученной на предыдущей итерации:

    <xsl:variable name="sum" select="$sin + $p1 * $p2 div $fact"/>

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

    <xsl:choose>
        <xsl:when test="$n &lt; $N">
            <xsl:call-template name="sin-row">
                <xsl:with-param name="x" select="$x"/>
                <xsl:with-param name="n" select="$n + 1"/>
                <xsl:with-param name="N" select="$N"/>
                <xsl:with-param name="sin" select="$sum"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$sum"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

Возведение в степень выполняет вторая итеративная функция — шаблон с именем power. Его построение довольно прямолинейно: передавая текущее вычисленное значение, повторно вызывать самого себя, пока не иссякнет запрошенный показатель степени:

<xsl:template name="power">
    <xsl:param name="x"/>
    <xsl:param name="n"/>

    <xsl:choose>
        <xsl:when test="$n = 0">1</xsl:when>
        <xsl:when test="$n = 1">
            <xsl:value-of select="$x"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:variable name="pow-1">
                <xsl:call-template name="power">
                    <xsl:with-param name="x" select="$x"/>
                    <xsl:with-param name="n" select="$n - 1"/>
                </xsl:call-template>
            </xsl:variable>
            <xsl:value-of select="$x * $pow-1"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

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

<xsl:template name="factorial">
    <xsl:param name="n"/>
   
    <xsl:variable name="fact-1">
        <xsl:choose>
            <xsl:when test="$n &lt;= 1">1</xsl:when>
            <xsl:otherwise>
                <xsl:call-template name="factorial">
                    <xsl:with-param name="n" select="$n - 1"/>
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
   
    <xsl:value-of select="$n * $fact-1"/>
</xsl:template>

Все готово для тестирования. Запускаем процессор и передаем ему данные из XML:

$ xsltproc sin.xslt sin.xml

На экране появляются результаты:

    sin(3.1415926535898) =  1.03457906425793e-11

    sin(1.5707963267949) = 1

Единица для sin(π/2) получилось вообще идеальной; результат sin(π) очень близок к нулю.

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

programming, xslt, fun, maths — 26 июля 2009

Зачем телефону камера

В то время как я думаю, как бы попробовать в действии CDMA-связь (скайлинковская симка-то есть, но обычный GSM-телефон с ней не работает), мысль ученых придумала использовать камеру телефона в медицинских целях.

«В ходе опытов гаджет объединили с одной из популярных моделей мобильного телефона Nokia, со встроенной фотокамерой разрешением 3,2 мегапикселя.

К устройству также прилагается держатель, фиксирующий стеклянные пластины с пробами крови».

fun — 23 июля 2009

Дата проведения

Материал для тестового задания к вакансии информационного дизайнера.

fun, outer, fackusability — 17 июля 2009

Справочник маршрутных такси

Издана необычная книга :-)

book, fun — 25 июня 2009

Фавайкон Альфа-клика

fun — 9 июня 2009

Про избыточность

Тут на днях мой last-name-тезка интересовался, где бы почитать про логику. Артём, все есть на улицах :-) Вот, например, учебник про избыточность.

Эти экспонаты находятся на Новинском бульваре.

fun, outer — 24 апреля 2009

Willkommen

В Берлине несколько аэропортов. На юго-востоке — Шёнефельд, на северо-западе — Тегель.

Компания Askania развесила около Шенефельда вот такую рекламу.

Такой же плакат висит и внутри здания.

fun, germany, berlin — 13 апреля 2009

Adamo vs. Pushnoy

Слева — реклама ультратонкого ноутбука Adamo by Dell. Справа — Лазарева с терменвоксом в «Хороших шутках».

fun, laptop, compare — 18 марта 2009

Hooj

fun, label — 1 марта 2009

Немного бреда :-)

paris, france, fun — 14 февраля 2009

Чай мента

fun, language — 2 февраля 2009

Партийный чум

outer, fun — 2 января 2009

Дверь дежурной в гостинице

fun — 30 декабря 2008

Про мощь и мощность

А ведь имели в виду наверное «мощь» :-)

error, fun, russian — 30 декабря 2008

Флаги в Пизе

Административное здание в Пизе на площади Vittorio Emanuele II.

Здание административное, поэтому такой флаг выглядит словно шутка выходного дня, но это не так. И в новостях ничего про это не написано, зато нашелся специализированный сайт, на котором отмечены координаты почти двух тысяч флагов, которые висят на зданиях в Пизе.

travel, italy, pisa, fun — 24 декабря 2008

Двенадцать способов правильно сфотографироваться у Пизанской башни

1. Подпереть башню ладонью















2. Придерживать двумя ладонями













3. Упираться руками на одном уровне





4. Коснуться одним пальцем



5. Коснуться двумя пальцами



6. Втиснуться боком



7. Прижаться спиной



8. Измерить высоту рукой



9. Взять башню между ярусами



10. Фривольно



11. Держать башню группой







12. Автофото



Бонус-кадр

travel, italy, pisa, tower, fun — 22 декабря 2008

Закрытый объектив и открытый OpenMoko

Эту смешную фотку девушки, фотографирующую через спецфильтр, я привез из Хорватии в апреле этого года. Но размещаю ее здесь не просто так. Справа в черной одежде — Харальд Вельте, чувак, который увлекательно рассказывает про OpenMoko (про телефоны на линуксе).

travel, croatia, openmoko, fun — 26 ноября 2008

Технология dontclick — каждому!

Вставьте к себе на страницу эти две строчки перед закрывающим тегом </body>, и будет у вас безкликовая навигация. Йох-ху!

<script type="text/javascript" src="http://deeptext.ru/js/dontclick.js"></script>
<script>dontclick();</script>

Желаемую задержку на переход можно установить самому, вызвав dontclick с параметром (в миллисекундах):

<script>dontclick(1000);</script>

internet, fun — 25 ноября 2008

Про свет

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

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

А телефон-то оказался спрятанным на диване под одеялом.

fun, light, fuck-usability — 4 октября 2008

Прокат животных

sign, fun — 8 мая 2002

И за НДС спасибо

fun — 27 апреля 2002

МОП

Что такое МОП?

fun — 22 апреля 2002

Загадочная реклама

Что может рекламировать этот сюжет?

fun — 20 апреля 2002

Соответствия

Правильное.
В Москве на Мерзляковском переулке находится банк Сибконтакт:

Неправильное.
Посольство Беларусии расположено на Армянском переулке.

moscow, navigation, fun — 19 апреля 2002

Лифт и здоровье

Это — фрагмент из инструкции, наклееной на дверь лифта:

fun, russian — 18 апреля 2002

CD-SUN

На днях сделал надпись на болванке и не дав ей высохнуть, вставил в дисковод.

fun — 16 апреля 2002