ash’s blog / июль 2009

Тупо-свичер

Самая тупая программа, которую можно посадить в трей на своем любимом компьютере, — это Punto Switcher.

На странице программы висит вот такой интерактивный баннер:

Как можно набрать два абзаца текста, ни разу на него не посмотрев? Поставьте себе лучше Соло Шахиджаняна, чесслово.

English wikipedia vs. Русская википедия

Схема Лиссабона, которую читатель видит в английской (слева) и русской (справа) Википедии наглядно показывает, насколько предпочтительнее английские статьи.

compare, wikipedia, lisbon, portugal — 30 июля 2009

Белые часы

А тем временем в часах на здании Телеграфа желтые лампочки заменили белыми светодиодами.

Надо было заодно, кстати, перевесить часы повыше: если идешь по Камергерскому, то часы заслоняются фонарным столбом.

moscow, outer, clock — 28 июля 2009

$7

Электронные билеты S7 — это три PDF-файла, высылаемые по почте:

* Confirmation_ru.pdf
* E-Ticket_itinerary_receipt_Andrew_Shitov_ru.pdf
* E-Ticket_itinerary_receipt_Andrew_Shitov_en.pdf

В каждом файле цветной мерзского цвета бланк. Оцените все плюсы.

(Закроем глаза на то, что идея с плюсами в рекламе несколько лет эксплуатировалась HP.) А плюсы этого билета (помимо того, что полезная информация мелка как пыль) в том, что если ты захотел билет вернуть, то надо переться в офис, чтобы они нажали на кнопку «Перевести деньги обратно на карту». Кстати, год назад на электронном билете печатали время прилета самолета в пункт вылета.

На деле оказалось чуть сложнее. В стоимость возврата помимо штрафа включаются плата за освобожение места (440 рублей) и за перевод денег (250). Причем последние 250 рублей нужно платить наличными, из-за чего и требуется зайти в офис. Расчеты оставшейся суммы выполняются на бумажке в столбик с перепроверкой настольным калькулятором CITIZEN. Паспорт при возврате денег не спрашивают, кстати.

Офис принимает заявки на возврат денег исключительно с 9 до 13 часов. Процедура нажатия кнопки «Перевести деньги обратно на карту» занимает 25-30 минут (не считая ожидания свободной кассы) и включает ручной ввод номера карты с бумажки, распечатанной с их же компьютера, и просьбу оставить номер телефона. За эти полчаса ты будешь сидеть на детском стулике, подбородок будет на уровне устроенной на столе кассира стеклянной витрины, и перед тобой будет сидеть женщина без мимики на лице, общающаяся с коллегами и оформляющая билет предыдущего посетителя.

avia, fuckusability — 28 июля 2009

“Programming Collective Intelligence”

Toby Segaran
Programming Collective Intelligence. Building Smart Web 2.0 Applications

August 2007, 360 pages

O’Reilly.

ISBN: 978-0-596-52932-1


This book is a collection of different methods of obtaining extra information from publicly available data. The author declares that Web 2.0 should not only be considered a vast container of user generated content. Web 2.0 term should be considered wider: all the content which is published by separate site owners is also a source of hidden information, which can be extracted by taking massive amounts of such pages. This second—and not well known—aspect is exploited by Google, for example, when it rates pages with the help of external links to each page.

First eleven chapters lead the reader from basic algorithms towards more difficult ones, and the last, 12th chapter, summarizes all the algorithms mentioned in the book. Appendixes cover maths used in the algorithms and contain the links to useful external libraries.

Description flows along with the programming code; author uses Python. I find this combination not too productive and convenient for the reader. It does not matter which programming language the reader prefers, they will definitely understand Python syntax and will be able to copy the logic in their own prefered language. The point is that when you need to learn (or refresh) the idea of an algorithm, you cannot do that without skipping the descriptions, which describe the code, not the algorithm. The structure of an algorithm is being expressed via the code, which adds lots of unnecessary details such as procedures of reading files and converting their content to a memory-located matrix. An intent to allow the reader with any level of knowing Python and any level of general programming skills leads to the need of avoiding SQL servers and using SQLite instead. That makes the dependence on code even deeper, and leads to less readable code as it has to include more instructions which—again—have no direct relation to the algorithm.

The presence of chapter 12 Algorithm Summary smoothes the sharp corners of previous code-extensive chapters. I would personally prefer more descriptive algorithms in the main chapters and the code in appendix.

Anyway, the book gives good introduction into modern techniques of data mining in the reality of modern internet, and is useful as both a guide for those who would like to expand their knowledge of how to deal with Web 2.0 data, and for those who wish to make their understanding of the topic wider.

I would recommend it to everyone who starts any web service or site which relate to processing of multiple data (both textual and numeric), and for those who are interested in modern methods of processing such data. It also helps to understand how popular online services—ranking, filtering, recommending, etc.—work.

4 stars. ★ ★ ★ ★

bookreview, book, web20 — 28 июля 2009

Личное пространство

Проведите эксперимент: случайно подойдите несколько раз на улицах Лондона вплотную к кому-нибудь, или подойдите близко, загляните в лицо и спросите, который час. В первом случае услышите: «Hey, look where you’re going!», во втором от вас шарахнутся.

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

people — 27 июля 2009

F*ck F*reF*x

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

Раз.

Два.

 

Три.

 


«И я за какой-то паршивый 14 лет эта гадюка терперь буду?» ©

internet, fuckusability — 27 июля 2009

travel, germany, berlin — 27 июля 2009

«XSLT. Сборник рецептов»

Сел Мангано
XSLT. Сборник рецептов

2008, 864 с.

М.: ДМК Пресс, СПб.: БХВ-Петербург

ISBN: 978-5-94074-419-1, 978-5-9775-0292-4

Перевод на русский язык второго издания XSLT Cookbook (ISBN 0-596-10974-7) издательства O'Reilly.


Название книги полностью соответствует содержанию. Эта книга — сборник рецептов по программированию на XSLT. Книга состоит из 16 глав, в которых описаны язык XPath, работа со строками, математические операции над числами, приемы обработки данных, содержащих дату и время, задачи обхода дерева и отбора элементов, возможности XSLT 2.0, преобразование XML в текст, XML, HTML и SVG, возможности генерации кода, выполнение запросов к наборам данных, а также рецепты применения в «вертикальных» приложениях, элементы расширений, тестирование, отладка и обобщенное функциональное программирование.

В каждой главе показаны решения 5-10 задач, причем в большинстве случаев приведены параллельные решения, учитывающие стандарты и первой, и второй версий XSLT. Там, где различия существенны, описываются детали и даются рекомендации о том, на что следует обратить внимание при переносе приложений.

Автор предполагает, что читатель знаком с основами XSLT и XPath. Книга не является ни учебником, ни справочником по XSLT, однако если учесть, что до настоящего времени на русском языке издано три или четыре книги, которые уже исчезли из магазинов, книга Сэла Мангано может служить и справочником для тех, кто знаком с XSLT 1.0 и желает узнать о нововведениях в XSLT 2.0 и XPath 2.0.

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

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

5 звезд. ★ ★ ★ ★ ★

bookreview, xslt, book — 26 июля 2009

travel, germany, berlin — 26 июля 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

Интересная профессия

Женщины, удаляющие траву, проросшую между камнями мощеной дорожки в парке Ташкента.

tashkent, uzbekistan — 25 июля 2009

New talks

A few talks I am going to give soon:

YAPC::Europe 2009, Lisbon, 3–5 August.

Measuring Perl in square kilometers (ligntning talk)

History of Russian-ish Perl community and its future plans at a glance.

Italian Perl Workshop, Pisa, 22–23 October.
Baltic Perl Workshop, Riga, 21 November.

Features of 5.10 in use

Although I have installed 5.10 on each machine I use just in a few days after the release, I've started to use new features of the language in real programmes after a year only.

I am going to show a number of examplaes from a real web application which extensively uses named captures in regular expressions as well as other new keywords.

Additionally: random thoughts about Modern::Perl and teaching Perl.

books.perl.org essentials (lightning talk)

A brief talk about how new books.perl.org is organized and how local Perl people can contibute.

perl, talk — 24 июля 2009

Плитвицкие озера

Самое интересное в Хорватии — это не пляжи, а  озера.

travel, croatia, water — 23 июля 2009

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

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

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

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

fun — 23 июля 2009

Rome

Да, кстати, Рим прекрасен.

travel, italy, rome — 23 июля 2009

Лёрн Инглишь

Пара мимоходных фоток об уровне знания соотечественниками английского языка.

The Dear Guests:


Launch box:

language, english, label — 23 июля 2009

Shit off?

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

Первый раз про то, что фамилия «английская», я услышал от школьного преподавателя, хотя она тогда не объяснила, в чем дело. Когда я разобрался в теме сам, стал время от времени говорить об этом с теми самыми носителями. Они всегда смеялись только после того, как я намеренно делал паузу между двумя словами. Даже если подумать, что все политкорректно молчат, никак нельзя объяснить факт: все внимательно выслушивают объяснение, и только после этого понимают, в чем суть. Но никогда раньше.

Первый раз я объяснял «значение» фамилии самым носительным носителям, на мероприятии в Лондоне. Вот кадр из моей презентации:

Так что сосите те, кто говорит, что с такой фамилией жить в англоговорящем мире сложно.

language, russian, english — 22 июля 2009

Любите MSIE

Самый главный недостаток веб-верстальщиков — их тяга к фаерфоксам и операм с одновременным игнорированием дефолтного браузера.

Одна и та же страница: слева в MSIE, справа — в Файрфоксе.

compare, internet, web — 18 июля 2009

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

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

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

Ups and downs

В 2000 году в журнале Computer Physics Communications мы опубликовали статью Gaussian wavelet features and their applications for analysis of discretized signals. Там были забавные иллюстрации с градиентами.

Вот так картинки выглядили в оригинальной публикации 1999 года.


А вот так — в международном журнале:

Иллюстрацию b (верхняя справа) напечатали перевернутой вверх ногами. Хотя, в общем-то, суть все равно передана правильно и всем понятна.

PDF со статьей, кстати, продают по тридцать долларов.

compare, wavelets — 16 июля 2009

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

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

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


На второй итерации срезали асфальт на проезжей части, на третьей — положили его на тротуар.


Еще пару недель все переходы выглядели так:


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


А после дождя — такие:


Последняя фотография сделана на уже благоустроенном сходе.

moscow, road, fuckusability — 15 июля 2009

Другие миры настройки

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

А вывод из этого такой: кто чем располагает, тот тем и настраивает. Это как другая вселенная, причем параллельная. Если никогда с ней не сталкиваться, то ни за что бы не подумал о таких хитроумных способах.

Берем ручной сканер штрихкодов. Он, конечно, подключается к компьютеру через USB, но вот настраивать его можно вовсе без компьютера, лишь бы было питание. К сканеру в комплекте прилагается толстая стостраничная брошюра с отпечатанными штрихкодами. Каждый штрихкод — отдельная команда. Например, есть штрихкод для входа в режим программирования, а есть команда для сохранения изменений.


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

На фоне этого споры программистов о том, как лучше хранить конфигурацию программ — в XML ли, в .ini ли, в YAML, — кажутся скучными.

compare, computer — 14 июля 2009

Error 500

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

fuckusability, internet — 14 июля 2009

33


Можно сказать, уже добрался до этой станции :-)

age, self — 9 июля 2009

Облик книги

Ребенок дорисовал недостающий элемент к облику обложки книги про облик книги.

book, child — 8 июля 2009

Ми бемоль

Мурашки по коже, когда это играешь сам и в первый раз.

music, notes — 3 июля 2009

История курсов валют

На этой неделе мы доили Центробанк.

В результате имеем детальные истории изменения курса валют, формируемые ЦБР для некоторых валют аж с начала 90-х годов. Правда, отображаются пока только данные с 1998 года, иначе пришлось бы бороться с гигантскими ступеньками на графиках.

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

whoyougle, money — 1 июля 2009

moscow, street — 1 июля 2009