MapChat

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



MapChat — это сервис для общения людей, в котором комнаты с сообщениями отображаются как точки на карте. Вы можете создавать новые точки, дописывать сообщения в уже созданные, делиться видео/аудио/фотографиями с друзьями где угодно!

Возможности:

обсуждение прошедших событий, встреч, концертов;
  • изучение иностранных языков посредством разговора с коренным населением;
  • гео-таргетированные игры, головоломки и квесты;
  • знакомства, поиск друзей.


Технологии:

MapChat сделан используя CouchApp (J Chris Anderson, спасибо тебе!) и GeoCouch (спасибо CouchOne за предоставление бесплатного хостинга и Volker Mische за реализацию) и полностью живет в CouchDB без использования каких-либо других back-end'ов. Такая структура приложения позволяет запускать его локально, пользоваться им без всяческих задержек и вне зависимости от подключения к сети интернет. В данный момент ведется разработка Android приложения (используя CouchDB для Android от CouchOne и PhoneGap). Так же используется сторонний сервис embed.ly для автоматического включения интерактивных элементов в общение пользователей (youtube, twitpic, soundcloud и т.п.). Embed.ly предоставляет JSONP API, но так как во время создания сайта, я старался следовать максимально жесткой политики безопасности — использование этого сервиса потребовало разработки JSONP и Embed Sandboxing методики.

JSONP и EMBED Sandboxing.

Как правило, при использовании стороннего контента (страниц/скриптов/embed элементов) разработчики сайтов прибегают к технике cookie-less domains, вставляя на страницу iframe указывающие на другой домен (конечно же, принадлежащий этому сайту). Таким образом содержимое iframe будет лишено доступа к главному окну и cookie сайта.
К сожалению, так как я разрабатывал распределенное приложение — реализация cookie-less domain была невозможна. (Каждый пользователь может запустить сайт у себя локально, а cookie-less domain является привязкой к какому-то определенному доменному имени). Поэтому пришлось разработать следующую нехитрую технику:

  1. Возьмем html-контент (foreign_html_content) со стороннего сайта, который мы хотим отобразить.
  2. Сгенерируем url следующего вида "data:text/html;charset=utf-8;plain," + foreign_html_content. Как видно, этот url есть ничто иное, как data url реализованый во всех современных браузерах
  3. Вставляем в страницу iframe с src равным этому url'у.
  4. Все готово!


Получившийся iframe не будет иметь доступа к родительскому окну и не сможет прочитать/записать cookie для главного домена.

JSONP Sandboxing реализуется практически также, за исключением того, что используется postMessage метод (который опять таки доступен в большинстве браузеров). В Iframe вставляется javascript callback функция, которая вызовет postMessage, и тэг script указывающий на jsonp url с callback равным имени этой функции. А дальше все просто, родительское окно добавляет этот iframe и устанавливает listener на событие message. Полученное сообщение и есть результат JSONP запроса.

В завершении статьи хочу напомнить ссылку сайта. (Пользователям Google Chrome я рекомендую поставить приложение из Webstore).

P.S.
Желающие поучаствовать в разработке или помочь проекту могут написать мне в личку или послать письмо на fedor@indutny.com
+30
8 января 2011, 11:05
24

комментарии (27)

+5
agul #
Спасибо, очень понравилось, особенно идея подобного проекта)
0
lolopolosko #
Спасибо! Понравилось. Вот если бы создать маленькую кнопочку для регистрации или входа было, бы еще круто! Удачи!
0
donnerjack13589 #
Так есть же! Правая из трех кнопок (когда незалогинены). Спасибо Вам!
0
lolopolosko #
Я немного не про то сказал. Я имел введу маленькие кнопки в углу с надписями. Чтобы сразу было написано вход/регистрация.
Просто первый раз когда зашел я немного запутался. Но это я только один такой :)
+3
Scorpi #
HABR O_O
+3
Scorpi #
Всё-всё, больше не буду :(
+1
antonzaycev #
еще бы время и если не сегодня, то дату, оставленного сообщения, показывать — было бы намного понятнее в чате, кто когда и почему.
0
donnerjack13589 #
Прямо сейчас этим займусь!
+2
donnerjack13589 #
готово!
0
Laytlas #
У меня почему-то приложение недоступно..., с чем это може быть связано?
–1
Laytlas #
Все заработало, приношу свои извинения.
–1
Laytlas #
А я уж подумал, что где-то в центре России появился халявный интернет.

0
Snapp #
Что-то у меня сервис лег, а еще мое местонахождение не определило, хотя я ему разрешил это сделать, ну и параллельно ошибки выскакивали по этому поводу.
0
donnerjack13589 #
Хабраэффект. Все снова работает!
0
v_k #
не получается зарегистрироваться: document update conflict
0
donnerjack13589 #
«Document update conflict» означает, что данный username уже используется. Текст заменен на user-friendly.
0
kr1z #
не получается зарегиться. Инкоррект логин ор пассворд =(
+1
SlackFolk #
Хорошая идея, теперь земляков полегче в интернете будет найти)
+1
RaSta #
спасибо за data url, как раз искал подобное решение.
но вот только не работает, дописал к ембеду алерт куков, и алертятся куки основной сессии.
не подскажете в чем может быть ошибка?
0
donnerjack13589 #
Спасибо! Похоже, что это баг Mozilla Firefox — Opera, Chrome обрабатывают это нормально. Тем не менее, доступ к parent window в firefox все-таки ограничен! (Уже пишу баг-репорт в mozilla).
+1
zona7o #
Похоже я нашёл занятие на оставшиеся выходные :)

P.S. Не получается userpic сменить :(
+1
zona7o #
разобрался с userpic) + узнал о новом сервисе граватаре :)
спасибо!
+1
david_mz #
Столько трудов и интересных идей — только чтобы интернет-гопота могла выложить иконками слово «хуй» на всю Сибирь. Сочувствую авторам проекта.
0
donnerjack13589 #
Авторы проекта просто пока еще не решили — что делать с произведениями «народного творчества». Почему бы вам не добавить точек, так чтобы получилось что-нибудь культурное? (Как только у меня будет доступ к компьютеру — удалю, спасибо!)
0
donnerjack13589 #
Убрал! )
0
luminox #
Как происходит позиционирование иконки чата на карте?? Допустим создал «комнату» человек из USA, написал одно сообщение, присоединилась еще 10 человек non-USA и общаются друг с другом. Где в этом случае будет иконка чата?
0
donnerjack13589 #
Точка останется на месте.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.