Приближается главный праздник года, по крайней мере по версии всевозможных торговых предприятий, которые начинают готовиться к нему за два месяца. И по этому поводу поделюсь с вами рождественско-новогодней музыкой. Все эти песни весьма известны и любимы.
Итак, отличный кавер на песню Леонарда Коэна.
Или вот прекрасная песня в исполнении ещё молодого и красивого Девида Боуи и уже не такого молодого, но ещё красивого Бинга Кросби. Те, кому не интересно слушать их рождественскую болтовню, могут сразу перематывать на 1:47, где начинается сама песня.
Ещё кавер.
На YouTube новогодне-рождественских песен столько, что выбрать среди них что-то очень сложно. Поэтому остановлюсь ещё на одной песне, о которой я уже как-то писал. На этот раз в бодром исполнении Trans-Siberian Orchestra.
Редакция блога желает всем отличного нового года. Спасибо, что вы нас читаете и даже иногда комментируете. Увидимся в следующем году.
Я продолжаю разбираться со словарём словоформ (морфологический словарь, spellcheck). Полтора года лежал и всё было замечательно, а тут столько всего и сразу.
Разбирательство началось с того, что в результирующем файле я не обнаружил слова «ниже», а закончилось перечитыванием документации по формату файлов hunspell и переписыванием ядра конвертера.
Словарь прирос на 4,5 Мб и ≈166000 словоформ. Можно скачивать, он определённо стал лучше, и теперь в нём есть слова «ниже» и «пониже».
- Скачать russian.diс.tar.bz2 (6 Мб)
- Скачать russian.dic.zip (6,7 Мб)
Ну и вкратце расскажу про сам формат 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 низкий #низкий --> ниже (ср.ст)Итак, у нас есть много строчек с правилами, которые нужно применить. Блоки в правиле разделяются пробелами. Список блоков:
- SFX для суффикса и PFX для префикса.
- Имя аффикса.
- Что искать.
- На что заменять.
- Условие в виде регулярного выражения, когда можно применить это правило.
- (Опционально)
#+ комментарий
Т. е. мы просто проходимся по всем правилам, проверяем условия и заменяем одну подстроку на другую.
Иногда в четвёртом блоке может встречаться ещё названия аффиксов. Это означает, что эти аффиксы тоже можно применить. В нашем случае это:
PFX Ss 0 по- . #приставка "по-" для наречий
PFX Sr 0 по . #приставка "по"0 означает, что ничего удалять не надо, будем только добавлять.
Ликбез завершён. Возможно потом, если будет желание или потребность, добавлю поддержку других опций, которыми изобилуют файлы аффиксов для проверки других языков. Ну и буду продолжать поддерживать словарь русского языка, пока в этом есть необходимость.
UPD 22 декабря 2013: Словарь обновлён.
Прошло полтора года с момента публикации предыдущей версии словаря. Но я про него не забыл: попробуй забыть одну из самых популярных записей, если судить по Google Analytics. И периодически я поглядывал на страницу проекта hunspell-ru в надежде увидеть там обновления, а их всё не было.
Но недавно новая версия таки была выпущена. Плюс к этому я переписал старый код конвертера из Hunspell в plain text. Старый код был написан на PHP в незапамятные времена. Разве можно было пройти мимо и оставить его таким как есть, а не переписать на каком-нибудь новом модном языке, например на Dart?
Нажимаем на одну из ссылок ниже и скачиваем архив. В архиве лежит единственный текстовый файл russian.dic, в котором перечислено большое количество русских слов во всех возможных формах, по одному слову в каждой строчке. Общее количество слов — 173975, словоформ — 2376434.
- Скачать russian.diс.tar.bz2 (6 Мб)
- Скачать russian.dic.zip (6,7 Мб)
Дальше используете файл на своё усмотрение. Например, можно подключить его в качестве словаря в PhpStorm, IntelliJ IDEA или Eclipse.

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

Очередной эксперимент. В этот раз я решил переписать весь 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.
Текущая версия скриптов тут. Комментарии не возбраняются, а очень даже приветствуются.
Сегодня мы будем слушать IDM. Это расшифровывается как Intelligent Dance Music. Не знаю, что в этой музыке Intelligent, а тем более Dance, но так этот стиль называется.
Вот эта композиция — одна из моих любимых, и она первая приходит на ум, когда речь заходит об IDM. Приятного прослушивания.