Tom Adler’s blog

ответы в поучаствованных темах™

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

Например, FriendFeed пытается объединить обсуждения в интерфейсе rss-читалки (очень неудобной читалки, на мой взгляд). Впрочем, до него несколько менее известных сервисов пробовали сделать то же самое. Disqus и IntenseDebate заходят с другой стороны, подключая к своей системе сами блоги авторов, а не читателей. Какой-то русский давно уже получил миллион долларов инвестиций под похожий скрипт комментирования, но у него вроде не было никакого api, и вообще он казался примитивным.

А другие программисты пока работают по старинке. На XPoint уже многие годы есть страничка «Поучаствованные темы» с благодарностями Давиду Мзареуляну и Алексею Волкову (кстати, я долгое время был уверен, что это Урбаншип, но сейчас вдруг засомневался). На этой страничке видны темы, в которых ты участвовал, если в них есть ещё не виденные тобой комментарии. Кажется, аналогичное было и в InvisionBoard, но не уверен.

Недавно я столкнулся с более интересным для меня вариантом — списком последних комментариев в темах, где ты оставлял комментарии. Правда, у Simon Willison и Болка это реализовано чуть по разному: в одном случае ты видишь даже свои ответы, а в другом — только чужие. Плюсы и минусы есть у обоих вариантов, я пока не знаю, который мне нравится больше. Но всё равно — это мой выбор, потому что для комментария должно быть достаточно одного только OpenID, и лишний раз отдавать свой емейл желания нет.

Впрочем, будет забавно, если фиды всё-таки дозреют до push-технологий, и мы получим фактически email-подписку, но с другого конца ; )

К чему я это всё пишу? Да просто прикрутил такую систему на свой уютный бложек™, и теперь моим редким комментаторам будет немного удобнее : )

Ну и ещё очень хочется сказать, что programming is fun again! Питон+джанго всё-таки жгут. Суть этой новой фишки делается двумя строчками:

userComments = Comment.objects.filter(user__exact=self.openid.user)
return Comment.objects.filter(object_id__in=[comment.object_id for comment in userComments]).order_by('-submit_date')[:25]

А как божественно просто было приделать оповещение меня по джабберу о новых комментах/пингах на блог — не устаю восторгаться! : )

, , , ,

там, где нет firebug

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

javascript:void(alert(…))

самое простое решение в такой ситуации — использовать букмарклет jash aka javascript shell. Пока что это лучшая из всех консолей, которые мне приходилось видеть, с историей, автодополнением, каким-никаким DOM Inspection и другими мелкими плюшками. Рекомендую, в общем. А пишу я об этом потому, что в неплохом русскоязычном блоге о яваскрипте JSToolbox появилась заметка об очередной альтернативной консоли, которая мне кажется слишком примитивной.

,

microsoft vs. world wide web

наверное, любой веб-разработчик, хоть немного интересующийся происходящим в своей области, слышал об HTML 5. В этом могучем документе сотни, если не тысячи, людей пытаются во всех подробностях описать мощную платформу для будущего интернета. Интересно, что параллельно с этим постепенно вырисовывается и очередная версия яваскрипта. А ещё интересно, в процессе разработки обоих спецификаций не обходится без интриг.

нет, я честно скажу, что не взялся бы отслеживать список рассылки по html5 или будущему яваскрипту — это уже слишком много для меня : ) Поэтому о происходящем внутри я некомпетентно сужу только по доносящимся оттуда вскрикам. И вот что мне в них слышно.

не так давно микрософт отправил своего представителя в html5. Естественно, вначале все переполошились, но потом этот Крис Вилсон вроде бы проявил себя с хороших сторон, и его приняли в песочницу. Даже через какое-то время поставили на пост председателя — руководить собраниями и пр. И только спустя месяцы стало заметно, что микрософт всё-таки потихоньку разработку стандарта саботирует. Ну ещё бы — ведь новый стандарт не должен годиться в конкуренты очередному детищу монстра, Silverlight.

в яваскриптовом лагере ситуация похожая, но интереснее. Там есть известный специалист Дуглас Крокфорд — автор JSON и многих довольно интересных текстов про яваскрипт. Сейчас он в Yahoo, едва ли не руководит соответствующим отделом. Ну и, естественно, участвует в обсуждениях следующей версии языка. А вот что забавно — в них он занимает почти ту же самую позицию, что и воины микрософта. И снова эта позиция производит впечатление большого якоря для прогресса. Мне лично неясно, какие для этого мотивы у самого Крокфорда, но микрософт аналогично не очень горит желанием видеть сильного конкурента своему нью-флешу.

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

,

учу setTimeout хорошим манерам

сейчас опять потратил полчаса на дебаг из-за малоизвестной «фичи» firefox — тайного параметра lateness, и решил избавиться от проблемы насовсем, благо яваскрипт позволяет:

if (Prototype.Browser.Gecko) {
    function handler(old, callback, time){
        return old(function(){ callback() }, time);
    }
    window.setInterval = window.setInterval.wrap(handler); 
    window.setTimeout = window.setTimeout.wrap(handler); 
};

теперь никакие левые параметры не будут переданы в сработавшую по таймеру функцию

, ,

микроформаты, yahoo, searchmonkey

Недавняя статья Юрия Артюха «G-club, микроформаты и дизайн» сподвигла меня оценить возможности Yahoo SearchMonkey — инициативы поисковика по улучшению результатов поиска. Точнее, улучшается не релевантность поиска, а отображение его результатов. Обычно гугл и яху показывают в основной ссылке содержимое title страницы, а сниппетом — meta description или кусок текста, окружающий искомые слова на странице. SearchMonkey позволяет увеличить число элементов, и показывать картинку, несколько релевантных ссылок, несколько пар ключ-значение для каждого результата поиска, как это видно на на примере у Юрия. Естественно, только на страницах самого Yahoo.

Этот результат достигается за два шага, не считая регистрации на Yahoo (что само по себе непростая задача, которую я решил только выбором ника mi4qcjho ;)

Первый шаг: создание для конкретного сайта или множества страниц нового Data Service — способа извлечь из страницы чистые данные. Если сайт делается прогрессивным разработчиком, и уже использует микроформаты типа hCard или XFN, то этот шаг можно пропустить, потому что для микроформатов есть готовые Data Service. В противном случае придётся немного напрячь мозги над несложным XSLT, извлекающим значимый текст. Для этого на странице Application Dashboard нужно кликнуть ссылку «Create a new data service», задать название сервиса и адреса тестовых страниц, и потом заняться собственно кодом. Поскольку у нас на mirtesen.ru hCard временно сломан, мне пришлось пойти сложным путём, и изобразить вот это:

<item rel="rel:Name" resource="{//h1/span}"></item>
<item rel="rel:Nickname" resource="{//span[@class='nickname']}"></item>
<item rel="rel:Birthday" resource="{//span[@class='bday']}"></item>
<item rel="rel:Photo" resource="{//img[@id='photo_for_preview']/@src}"></item>
<item rel="rel:Interests" resource="{//p[@class='tags']}"></item>
<item rel="rel:Description" resource="{//li[@class='birthday']/following-sibling::li[last()]}"></item>

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

Второй шаг — это собственно настройка того, что вы хотите показывать в результатах поиска. Для этого на странице Application Dashboard нужно кликнуть ссылку «Create a New Application», ввести очевидные метаданные приложения, и опять ввести тестовые адреса. Затем нужно выбрать, какие Data Service вы собираетесь использовать в своём приложении. Яху предлагает несколько своих стандартных, включая и микроформаты, но мне пришлось нажать «Add More Data Services» и добавить только что созданный сервис. И на следующей странице я, наконец, взялся за оформление. Оно задаётся с помощью — сюрприз! — кода на PHP. Конечно, запустить шаловливые ручки в HTML не дадут, и PHP используется только для примитивной обработки данных. Тут я исследовал ещё не все возможности, потому что пошёл по стандартному пути, подсказанном примером кода. Я указал, что будет текстом ссылки, какая фотография релевантна этой странице, добавил несколько контекстных ссылок и отдельных полей. Соответствующие конкретному результату поиска данные предоставляются теми самыми Data Services, которые выбраны для этого приложения: их поля находятся справа от textarea, и простым кликом вставляются туда, где стоит курсор. Получается что-то вроде этого:

$ret['title'] = Data::get('smid:n8t/rel:Name/@resource');
$ret['image']['src'] = 'http://mirtesen.ru' . Data::get('smid:n8t/rel:Photo/@resource');
$ret['dict'][0]['key'] = 'Интересы';
$ret['dict'][0]['value'] = Data::get('smid:n8t/rel:Interests/@resource');

Опять-таки внизу страницы есть тормозной, но полезный отладчик. Правда, здесь он ещё и глючит, если параллельно редактировать Data Service и само приложение, но терпение и труд всё перетрут. Готовое приложение можно сохранить, добавить в общий каталог, и начать использовать самому. Вот приложение для mirtesen.ru, которое получилось у меня.

Пока что остаются непонятными несколько вещей. Во-первых, даже несмотря на то, что я вручную включил для себя это приложение, результаты поиска отображаются традиционным способом, а не как у LinkedIn. Для просмотра улучшенного варианта приходится кликать на кнопочку под каждым результатом. Во-вторых, пока неясно, как включить приложение для всех пользователей Yahoo, если я владею сайтом. Ну и последняя загадка — кому это нужно в рунете, учитывая популярность яхи здесь : )

,