Музыка по воскресеньям — 16

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

Итак, отличный кавер на песню Леонарда Коэна.

Kevin Littlefield — Hallelujah

Или вот прекрасная песня в исполнении ещё молодого и красивого Девида Боуи и уже не такого молодого, но ещё красивого Бинга Кросби. Те, кому не интересно слушать их рождественскую болтовню, могут сразу перематывать на 1:47, где начинается сама песня.

Bing Crosby & David Bowie — The Little Drummer Boy / Peace On Earth

Ещё кавер.

Anthem Lights — All I Want For Christmas Is You

На YouTube новогодне-рождественских песен столько, что выбрать среди них что-то очень сложно. Поэтому остановлюсь ещё на одной песне, о которой я уже как-то писал. На этот раз в бодром исполнении Trans-Siberian Orchestra.

Trans-Siberian Orchestra — Saraevo 12-24 (Carol of the Bells)

Редакция блога желает всем отличного нового года. Спасибо, что вы нас читаете и даже иногда комментируете. Увидимся в следующем году.

Hunspell

Я продолжаю разбираться со словарём словоформ (морфологический словарь, spellcheck). Полтора года лежал и всё было замечательно, а тут столько всего и сразу.

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

Словарь прирос на 4,5 Мб и ≈166000 словоформ. Можно скачивать, он определённо стал лучше, и теперь в нём есть слова «ниже» и «пониже».

Ну и вкратце расскажу про сам формат hunspell. Рассказывать буду на примере того, как выглядит словарь, который мне пришлось разбирать, т. к. вообще-то могут быть некоторые девиации. У меня не было цели написать полный конвертер для всех языков и словарей.

Словарь hunspell состоит из двух файлов: словаря (.dic) и аффиксов, т. е. префиксов или суффиксов (.aff). В собственно словаре (.dic) содержатся слова в начальной форме и список правил для аффиксов, которые к этому слову применяются. Например:

низкий/CCCDCo

Тут у нас три двухбуквенных аффикса: CC, CD и Co. Дальше смотрим в файл аффиксов, чтобы понять, что все это значит. Тут я приведу только кусочек, связанный с нашим словом «низкий».

SFX CC ий ого [гкх]ий #низкий --> низкого (е.ч.м.р.р.п.)
SFX CC ий ому/Ss [гкх]ий #низкий --> низкому (е.ч.м.р.д.п.)
SFX CC ий им ий #низкий --> низким (е.ч.м.р.т.п. и мн.ч.о.р.д.п.)
SFX CC ий ом [гкх]ий #низкий --> низком (е.ч.м.р.п.п.)
SFX CC ий ая [гкхжчшщ]ий #низкий --> низкая (е.ч.ж.р.и.п.)
SFX CC ий ой [гкх]ий #низкий --> низкой (е.ч.ж.р.р.п.+д.п.+т1.п.+п.п.)
SFX CC ий ую [гкхжчшщ]ий #низкий --> низкую (е.ч.ж.р.в.п.)
SFX CC ий ою [гкх]ий #низкий --> низкою (е.ч.ж.р.т2.п.)
SFX CC ий ое [гкх]ий #низкий --> низкое (е.ч.с.р.и.п.)
SFX CC ий ие ий #низкий --> низкие (мн.ч.о.р.и.п.)
SFX CC ий их ий #низкий --> низких (мн.ч.о.р.р.п.+п.п.)
SFX CC ий ими ий #низкий --> низкми (мн.ч.о.р.т.п.)

SFX CD кий ок [^аеиоуыэюяжчшщйь]кий #низкий --> низок (кр.ф.е.ч.м.р.)
SFX CD ий а [^нраеиоуыэюя]ий #низкий --> низка (кр.ф.е.ч.ж.р.)
SFX CD ий о [^нржчшщаеиоуыэюя]ий #низкий --> низко (кр.ф.е.ч.с.р.)
SFX CD ий и ий #низкий --> низки (кр.ф.мн.ч.о.р.)

SFX Co зкий же/Sr низкий #низкий --> ниже (ср.ст)

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

  1. SFX для суффикса и PFX для префикса.
  2. Имя аффикса.
  3. Что искать.
  4. На что заменять.
  5. Условие в виде регулярного выражения, когда можно применить это правило.
  6. (Опционально) # + комментарий

Т. е. мы просто проходимся по всем правилам, проверяем условия и заменяем одну подстроку на другую.

Иногда в четвёртом блоке может встречаться ещё названия аффиксов. Это означает, что эти аффиксы тоже можно применить. В нашем случае это:

PFX Ss 0 по- . #приставка "по-" для наречий

PFX Sr 0 по . #приставка "по"

0 означает, что ничего удалять не надо, будем только добавлять.

Ликбез завершён. Возможно потом, если будет желание или потребность, добавлю поддержку других опций, которыми изобилуют файлы аффиксов для проверки других языков. Ну и буду продолжать поддерживать словарь русского языка, пока в этом есть необходимость.

UPD 22 декабря 2013: Словарь обновлён.

Словарь словоформ русского языка

Прошло полтора года с момента публикации предыдущей версии словаря. Но я про него не забыл: попробуй забыть одну из самых популярных записей, если судить по Google Analytics. И периодически я поглядывал на страницу проекта hunspell-ru в надежде увидеть там обновления, а их всё не было.

Но недавно новая версия таки была выпущена. Плюс к этому я переписал старый код конвертера из Hunspell в plain text. Старый код был написан на PHP в незапамятные времена. Разве можно было пройти мимо и оставить его таким как есть, а не переписать на каком-нибудь новом модном языке, например на Dart?

Нажимаем на одну из ссылок ниже и скачиваем архив. В архиве лежит единственный текстовый файл russian.dic, в котором перечислено большое количество русских слов во всех возможных формах, по одному слову в каждой строчке. Общее количество слов — 173975, словоформ — 2376434.

Дальше используете файл на своё усмотрение. Например, можно подключить его в качестве словаря в PhpStorm, IntelliJ IDEA или Eclipse.

Настройка PhpStorm

Знаю-знаю, писать комментарии к коду на русском языке не комильфо. Но ведь в IDE можно писать не только код. Я, например, пишу тексты для этого блога в PhpStorm (исходники блога на GitHub). Да и мало ли может быть применений! Но должен предупредить: файл словаря имеет размер 53 Мб, что не слишком благоприятно сказывается на объёме используемой IDE памяти.

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

UPD 18 декабря 2013: Словарь обновлён.
UPD 22 декабря 2013: Словарь обновлён.

Dart

Очередной эксперимент. В этот раз я решил переписать весь JavaScript-код этого блога на новомодном Dart. И если результат я не выложу в итоге на рабочий сервер, это всё равно неплохая возможность взглянуть на новый язык. Почему именно Dart? Даже и не знаю. Мне подход с написанием языка с нуля нравится больше, чем попытки исправить недостатки JavaScript с помощью всяких надстроек, как в случае TypeScript или CoffeeScript. Я не говорю, что это плохие языки, просто они пытаются обойтись «малой кровью», а Google, создатель Dart, играет по крупному.

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

var sum = (a, b) {
     return a + b;
};

Или даже ещё короче:

var sum = (a, b) => a + b;

Но это мелочи. Гораздо интереснее исправленные области видимости. Например, переменная, объявленная внутри цикла for, не видна вне его. Очень понравилось, как в Dart переделали всю структуру DOM-объектов. Например, у элементов свойство textContent превратилось в text, а childNodes в nodes. Наконец-то attributes — это явный ассоциативный массив, а не NamedNodeMap плюс набор методов вроде getAttribute и setAttribute. И classes — это множество, а не строка. Красота!

События тоже претерпели сильные изменения. Нет больше element.onclick и element.addEventListener (attachEvent в старых IE). Теперь события представляют собой потоки, на которые можно подписываться. Теперь нужно писать:

button.onClick.listen((event) {
    // do something
});

А если нужно, чтобы обработчик сработал только один раз:

button.onClick.first.then((event) {
    // do something
});

Свойство first в примере выше является Future, что по сути то же, что и Promise. Я, кстати, не знаю, в чём разница между Futures и Promises, буду рад, если кто-нибудь объяснит.

Конечно, вся эта красота не приходит просто так. И если текущая сжатая версия скриптов для блога на языке Dart занимает 13 кб (по большей части из-за подключённой библиотеки интернационализации), то она же, но скомпилированная в JavaScript, все 134.

Текущая версия скриптов тут. Комментарии не возбраняются, а очень даже приветствуются.

Музыка по воскресеньям — 15

Сегодня мы будем слушать IDM. Это расшифровывается как Intelligent Dance Music. Не знаю, что в этой музыке Intelligent, а тем более Dance, но так этот стиль называется.

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

edIT — Laundry

← СтаршеМоложе →