Прикольное дополнение к моей недавней заметке про надпись «Окрашено» из книги Taalfoutjes («Языковые ошибочки»), изданной в этом году.
Осторожно, окрашинно!
Знают ли маляры о том, что слово nat пишется с t на конце? Они пишут его с d, а иногда даже с dt.
Несколько реальных историй, которые произошли со мной во время изучения голландского языка. Это перевод домашнего задания полуторогодичной давности. (Для любопытных — оригинал мелким шрифтом.)
Когда живешь несколько лет в чужой стране и каждый день в магазине сталкиваешься с повторяющимися вопросами типа «Пакет нужен?» или «Чек возьмете?», начинаешь отвечать «нет» на все подряд. Как-то я зашел в магазин за новыми джинсами. Подхожу к кассе. Кассир мне что-то говорит, я отвечаю «нет». Она дальше:
— Нет?
— Нет-нет.
— Да? Па-ра-та-ра-ба-ра скидка та-та-на-па-па-па? Может быть вам ра-па-па на-на-на со скидкой?
— Нет, спасибо.
— ОК, 59 евро.
Ладно, это было почти два года назад. Сегодня я, конечно, справился бы лучше и уже совсем не боюсь пользоваься голландским в магазинах. Я знаю, что всегда могу переключиться на английский, поэтому стараюсь говорить по-голландски как можно дольше.
Вечером на кассе. Пока расплачиваюсь, кассир меняется, а чек мне не дали. А мне он прям нужен в этот раз.
— Простите, можно лес?
— Что-что?
— Лес, говорю, можно? Мне нужен лес.
— ??
— Э-м. Ну лес, такая маленькая бумажка. А, чек!
(Чек по-голландски — bon, а лес — bos.)
Думаете, это меня остановит? Никогда. Я не занимался голландским почти два года, живя здесь, а теперь три занятия в неделю, так что надо пользоваться случаем. Захожу в следующий магазин, а в голове уже готова парочка предложений для разговора. А предложения такие отточенные и хорошие, почти предмет искусства, я их прорепетировал три-четыре раза. Разговор с продавцом пошел очень легко. Я говорю, он отвечает. Я делаю паузу, чтобы немного проанализировать, что он ответил, и — ура! — понимаю ответ. Еще вопрос — еще ответ.
Но наконец:
— Ох, не. Говори помедленнее.
— Оу, пардон. Скажи, откуда ты?
— Из Москвы.
— Да? А не похоже. По акценту ты как из Южной Африки.
(Магазин — Apple Store, продавец молодой, поэтому разговор на je ты не вызывает вопросов.)
А вот еще одна история. Мне нужно было передать коллеге ключи от офиса. Он прилетал на неделю из Москвы вечерним самолетом. Я заранее пришел в гостиницу и сделал там свой перформанс (все это по-голландски, разумеется):
— Добрый вечер!
— Угу.
— Сегодня у вас остановится мой коллега. Вот у меня есть номер его брони. Вы можете передать ему ключи? Он еще летит в самолете, а прибытие полдевятого, так что он тут будет где-то в десять. Можно оставить ключи вам?
Ну правда здорово? Такой длинный монолог. И знаете, что мне ответили в гостинице?
— Sorry, I don't speak Dutch.
Heb je voor een jaar of twee in het buitenland gewoond? Dan kun je enkele woorden en kleine zinnen hard studeren. ‘Tasje?’ ‘Bonnetje erbij?’ Als je ze elke dag hoort, begin je altijd ‘Nee’ te zeggen. Je wordt een automaat dat alleen één woord zegt.
Nou ben ik in de winkel om een nieuwe jeans te kopen. Ik ga naar de kassa. De verkoper zei iets. Ik zei ‘Nee’. Zij vraagt verder:
— Nee?
— Nee, nee.
— Ja? Pa-ra-ta-ra-ba-ra korting ta-ta-na-pa-pa-pa? Misschien wilt u ra-pa-pa na-na-na met korting?
— Nee, dank u.
— OK, negenenvijftig euro.
Nou, het was bijna twee jaar geleden. Vandaag ken ik meer woorden natuurlijk. En ik ben ook niet bang om Nederlands te spreken in winkels. Ik weet dat ik altijd Engels kan gebruiken, dus probeer ik spreek zo lang als mogelijk.
Een avond. Ik ben in de winkel bij de kassa. Terwijl ik betaal, gaat de kassier weg en een andere vrouw komt. En ik heb geen bon genomen!
Nou, ik heb het niet nodig, maar ik wil een praatje maken.
— Mevrouw, kan ik een bos hebben?
— Wat zegt u?
— Een bos. Ik wil een bos. Kan ik?
— ??
— Erm… Een bos. Een kleine papier. Oh. De bon.
Denk je dat het kan me stoppen? Nooit. Nou, ik had geen Nederlandse lessen voor bijna twee jaar, en nu ga ik naar de les drie keer per week dus ik zal meer gelegenheden hebben. Ik ga naar andere winkel en ik heb een paar zinnen in mijn hoofd vóór ik in de winkel ben. Ja, ja, mijn zinnen zijn zo goed, ze zijn bijna kunst: ik heb ze drie of vier keer gerepeteerd. Een praatje met de verkoper was erg makkelijk. Ik zeg, hij antwoordt. Ik maak een pauze om zijn woorden te analyseren. Oh, ik weet wat hij heeft gevraagd! Volgende vraag, volgend antwoord.
Eindelijk:
— Oh, nee, je spreek te snel.
— Oh, sorry. Zeg, waar kom je vandaan?
— Uit Moskou.
— Je ziet er uit niet zoals die uit Moskou. Je accent zegt dat je uit zuid Afrika bent.
Gisteren moest ik om de sleutels van de office aan mijn collega geven.
Hij kwam uit Moskou voor een week, en zijn vlucht was te laat. Ik ga naar zijn hotel en doe een kleine voorstelling.
— Goedenavond. Mijn collega gaat hier verblijven vanavond. Ik heb zijn reserveringsnummer. Kan u hem deze sleutels geven? Hij is nu in het vliegtuig, en de aankomst is om half negen, dus hij moet bijna om tien uur in het hotel zijn. Kan ik de sleutels aan u geven?
Prima, hé? Wat de vrouw in het hotel heeft me geantwoord, denk je?
— Sorry, I don’t speak Dutch.
Я почти никогда не пишу в этот блог о программировании, поэтому есть повод написать. Берем сортировку методом пауз, язык программирования Go и смотрим, как там можно применить встроенную в язык параллельность, каналы и горутины.
package main
import(
"fmt"
"time"
)
var get_value chan int
func send_value(x int) {
time.Sleep(int64(x) * 1E8)
get_value <- x
}
func main() {
values := []int{3, 1, 9, 7, 2, 6, 4, 8, 5, 10}
get_value = make(chan int)
for _, x := range values {
go send_value(x)
}
for range values {
fmt.Println(<- get_value)
}
}
Самое большое умиление (изумление?) — отказ компилятора самостоятельно расширять типы, например, попытка умножения int на int64 приводит к ошибке компиляции.
Конструкция с переменной _ и оператором range — типовой подход для обхода массивов без счетчиков.
Очень приятный (хоть и по-паскалевски выглядящий) оператор :=, который позволяет немного экономить на объявлении типа переменной.
Ну а за реализацию конкурентных вычислений — респект и уважуха.
go, programming, fun, algorithm — 3 июля 2011
Вверху — оригинальный пост Толика про ВКонтакте, внизу — перевод, сделанный Google Translate, попавший на Say Perl.
Сколько ножниц нужно купить в Икее, чтобы ими можно было начать пользоваться дома?
fun, ikea — 24 декабря 2010
fun — 9 сентября 2010
Слышал, что какую-то почту переводят полностью на AJAX. Сегодня я получил AJAX-письмо, правда, пока это спам.
fun, label — 18 августа 2010
fun, internet, fuckusability — 25 марта 2010
28 марта Россия переходит на летнее время.
Муниципальные службы Москвы начали подготовку к переходу.
Через три дня после блокирования моей карты Альфа-банк прислал-таки смску: Uvazhaemyj klient ALFA-BANKA!V svjazi s komprometaciej Vasha karta 5*45 budet perevypushena i dostavlena v Vashe otdelenie Banka v techenie 2 nedel.
После тестирования скростного «Сапсана», который едет из Москвы в Питер за три часа 45 минут, весьма нелепо смотрится реклама ноутбука с аккумулятором, способным работать 9 часов, в рекламе которого емкость аккумулятора иллюстрируют расстоянием от Москвы до Питера.
Яндекс не разглашает своих алгоритмов ранжинования записей в блогах в их рейтинге.
Надо дать возможность каждому подобрать свою секретную формулу:
Чешские авиалинии учудили с переводом названия своей промо-акции.
Вчера читал ребенку сказку про Рапунцель.
Сегодня читаем про Румпельштильцхен.
child, literature, fun — 20 августа 2009
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> </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 < $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 <= 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, fuckusability — 17 июля 2009
book, fun — 25 июня 2009
fun — 9 июня 2009
fun, russian — 27 мая 2009
Тут на днях мой last-name-тезка интересовался, где бы почитать про логику. Артём, все есть на улицах :-) Вот, например, учебник про избыточность.
Эти экспонаты находятся на Новинском бульваре.
fun, outer — 24 апреля 2009
В Берлине несколько аэропортов. На юго-востоке — Шёнефельд, на северо-западе — Тегель.
Компания Askania развесила около Шенефельда вот такую рекламу.
Такой же плакат висит и внутри здания.
fun, crisis — 26 марта 2009
Слева — реклама ультратонкого ноутбука Adamo by Dell. Справа — Лазарева с терменвоксом в «Хороших шутках».
fun, label — 1 марта 2009
fun — 13 февраля 2009
fun, language — 2 февраля 2009
outer, fun — 2 января 2009
fun — 30 декабря 2008
Административное здание в Пизе на площади Vittorio Emanuele II.
Здание административное, поэтому такой флаг выглядит словно шутка выходного дня, но это не так. И в новостях ничего про это не написано, зато нашелся специализированный сайт, на котором отмечены координаты почти двух тысяч флагов, которые висят на зданиях в Пизе.
Эту смешную фотку девушки, фотографирующую через спецфильтр, я привез из Хорватии в апреле этого года. Но размещаю ее здесь не просто так. Справа в черной одежде — Харальд Вельте, чувак, который увлекательно рассказывает про OpenMoko (про телефоны на линуксе).
Вставьте к себе на страницу эти две строчки перед закрывающим тегом </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
fun — 16 апреля 2002