Tom Adler’s blog

pingback не умер, он просто так пахнет

Иван Сагалаев написал пост «Обсуждения через блоги» про пингбеки. Странным образом это почти совпало по времени с моими размышлениями на ту же тему. Положительные их стороны правильно перечислены у Ивана, мне самому эта идея очень нравится. Только вот большинство пингбеков в моём блоге — это ссылки моих же постов друг на друга, как здесь, например. Я даже не знаю, работает ли ещё тот код, или сломался во время одного из обновлений системы.

Конечно, нельзя забывать и о том, что и комментов у меня в блоге почти вообще нет, не то, что технически и психологически более сложных пингбеков. (И тут я из-за лени тоже не знаю, работает ли ещё openid-аутентификация, или уже нет : )

В общем, из-за этих мыслей потихоньку думаю перевести блог на CouchDB, пусть она будет сама себе вебсервером, как оракл % ) Благо, от постгреса я уже отказался в пользу SQLite, а тут ещё и с модной штучкой на яваскрипте повожусь. И чтобы не возиться с подключением OpenID к CouchDB, можно комментарии вообще отключить за непосещаемость.

закат opensearch suggestions в оперу вручную

этот пост — о том, как включить в опере поисковые подсказки

есть такой чудесный стандарт OpenSearch, который позволяет нам описывать в XML урлы для поиска по сайту. К нему есть не менее чудесное дополнение Search Suggestions, которое позволяет получать результаты поиска в удобном формате. Первый стандарт позволяет добавить в поле поиска новый вариант «искать по этому сайту». Второй — показывать пользователю некоторые результаты ещё когда он пишет запрос. Первый удобно работает в Firefox и внезапно! в IE. Второй красиво работает в Chrome: достаточно зайти на поддерживающий стандарт сайт, и после этого прямо в адресной строке пишете «домен-Tab-запрос» — и вот вам подсказки.

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

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

задача, на самом деле, простая: у оперы есть файл search.ini, в котором описаны поиски, которые вы добавили в оперу. В этом файле нужно для сайтов, поддерживающих OpenSearch suggestions, добавить две строчки с форматом подсказок и урлом.

к сожалению, у оперы нет API для работы с такими настройками, и даже в Opera Link настройки подсказок не сохраняются. Кроме того, при выходе опера переписывает search.ini новейшими настройками, поэтому при редактировании файла опера не должна быть запущена. Единственным вариантом в таком случае становится внешняя программа. Я люблю веб-стандарты и давно хотел сделать для оперы какой-нибудь виджет, поэтому стал решать проблему виджетом.

особых чудес в коде нет: дать пользователю открыть файл, прочитать его содержание, отпарсить поиски, проверить наличие opensearch на сайтах, скачать XML'ки, вынуть из них урлы подсказок, если таковые присутствуют, сохранить в файл.

в общем, если вы пользуетесь оперой и поисками по сайтам в опере, вот вам виджет «Search Suggestions». Установите его в опере, запустите, закройте оперу, следуйте инструкциям в виджете :)

,

словари произношения и user generated content

те программы-словари, которыми мне приходилось пользоваться, обычно включали в себя очень полезную возможность послушать, как слово произносится носителем языка. То же самое есть и на Яндекс.Словарях и на Google Translate. Однако онлайн-словари и «Лингво» используют собственные базы, и наверняка ни с кем не захотят ими делиться. И, если хочется иметь на наладоннике хороший словарь, то «Лингво» (если он вообще выпущен под эту ОС) стоит денег, а на gprs-трафик денег за границей не напасёшься.

хорошо, что есть, например, открытая база WyabdcRealPeopleTTS — 70 мегабайт wav-файлов с 20 тысячами английских слов. Плохо, что это только для английского языка. Кроме того, как я понимаю, ей уже довольно много лет.

возможно, проблему может решить хороший движок text-to-speech. Правда, я довольно далёк от темы, и последнее, что я слышал про хорошее TTS, — что весит оно гигабайта полтора, и, видимо, тоже только для английского. Наверное, если отрезать от него всё, кроме произнесения отдельных слов, он станет полегче, но сомневаюсь, что сильно легче. Интересно, какая с ними сейчас ситуация на самом деле?

возможно, на помощь может прийти толпа. Довольно легко сделать сайт, который показывает посетителю три слова по очереди и просит произнести их в микрофон. Флеш записывает звук, жмёт его хотя бы в ogg и шлёт на сервер. Другой посетитель получает три варианта произношения одного слова и выбирает из них лучший. Все получают какие-нибудь бейджики и соревнуются друг с другом. Сервер же раздаёт торрентами готовые базы произношений на 5, 10, 20, 50 тысяч самых употребляемых слов каждого языка.

понятно, что ugc не без проблем, обычно их можно преодолеть. Но нужны ли словари произношения кому-нибудь? Имеет ли смысл заниматься этим?

ps: долгое время я пользовался Stardict и ценил его за перевод текущего выделения. Однако его бесчеловечность мне всё-таки надоела, так что теперь я не могу нарадоваться на фичи GoldenDict, чего и вам рекомендую.

расширение для оперы «у всех работает»

кратко: установите расширение в оперу, откройте неработающий сайт, смотрите внизу страницы

подробно: недавно меня восхитила функция браузера Chrome, которая при недоступности сайта проверяет его доступность для других пользователей. Я нередко пользовался для такой проверки сайтом DownForEveryoneOrJustMe.com, но заходить на него приходилось вручную, и это было не очень удобно. А тут проверкой занимается сам браузер — это же круто! Думаю, уже через полгода такое будет во всех браузерах.

впрочем, я не уверен, что разработчики браузеров со мной в этом согласятся, поэтому я решил приблизить этот момент хотя бы для себя. Тем более, что у меня давно руки чесались попробовать написать расширение к опере. По пути к успеху я нашёл несколько граблей, которыми хочется поделиться.

казалось бы, всё очень просто: допиливаем под себя пример конфига, пишем пару скриптов, зипуем, меняем расширение на oex и всё. Но нет. Во-первых, статьи на dev.opera.com не очень-то структурированы, с которой начинать, неясно. Во-вторых, с момента, когда были написаны многие из них, кое-что успело измениться, в том числе спецификация виджетов. В-третьих, куда же без глюков.

локализация — самое интересное для меня, потому что система хорошая, и мне давно было интересно попробовать, как всё само работает. Получилось не так радужно из-за остальных косяков, но когда я их исправил, всё и правда стало хорошо. У меня строки используются только в скриптах, поэтому я положил в locales/en/messages.js и locales/ru/messages.js по объекту со строками, подключил в index.html <script src="messages.js"></script>, быстро набросал nano-gettext с подстановками. Если бы в html было много строк, пришлось бы и сам index.html копировать в папки локалей и переводить целиком. А сейчас я понимаю, что нужно было оставить английский messages.js в корне, чтобы для неизвестных локалей включался именно он.

что касается яваскрипта, то аккуратно разложив код по функциям, я обнаружил, что переменную domain приходится пробрасывать едва ли не в каждую. Связано это с тем, что расширение может работать параллельно с несколькими страницами, и глобальные переменные там не поиспользуешь. Поскольку domain приходит мне в onmessage, для простоты пришлось перенести объявление всех функций внутрь этой.

когда я ещё не знал, что messages.js будет автоматически выниматься из нужной папки, я собирался основывать локализацию на <content xml:lang="">, чтобы каждый из них ссылался на соответствующий index.html, а тот уже подключал бы правильный messages.js. Потом выяснилось, что это не работает, и не по спеке, но index.html сохранил радующий своей минималистичностью вид:

<!DOCTYPE html>
<title></title>
<script src="script.js"></script>
<script src="messages.js"></script>

отдельная забавная задача: как определить, что опера сейчас показывает ошибку подключения к сайту? Сейчас это работает не очень-то надёжно : ) Скрипт будет активизироваться на любом документе, содержащем только один стиль, адрес которого начинается на file:// и заканчивается на styles/error.css. К сожалению, мне не удалось найти никаких более надёжных переменных или значений. Парсить же текст страницы смысла не имеет, потому что он переведён на кучу языков и меняется в разных версиях. Надеюсь, мой способ будет работать достаточно хорошо : )

теперь мне нужно подождать несколько дней, пока расширение изучат и выложат на сайт. Если это случится, адрес, скорее всего, будет вот такой: «Up For Everyone». Там будет работать автообновление, поэтому лучше использовать этот источник.

,

назначить обработчик и сразу вызвать его

сегодня случайно наткнулся в блоге автора script.aculo.us на любопытный трюк. Нередко бывает нужно выполнять какую-то функцию не только по событию, но и однократно при загрузке страницы. Обычно это делается так: определяем функцию как именованную, вызываем её и назначаем как обработчик:

function fix(){…}
fix();
document.addEventListener('click', fix, false);

однако есть более любопытный и красивый способ добиться этого:

document.addEventListener('click', (function(){
    // do something
    return arguments.callee;
})(), false);

анонимная функция выполняется сразу и возвращает саму себя, чтобы это возвращённое значение можно было сразу использовать. Очень симпатичный трюк! Впрочем, неясно, стоит ли его использовать: из-за своей нетривиальности он заметно повышает WTF-фактор кода. Как думаете, стоит игра свеч?