Задумал написать форум. Вообще-то это должно быть смешно, да? :-). Столько разных форумов понаписано — выбирай только. Но я уверен, что форумов не может быть много: есть толпа вариантов и мелочей, которыми можно быть довольным или недовольным. Вот и у меня появилось достаточно идей, желаний и недовольств моим текущим форумом, которые в сочетании с простотой написания веб-приложений на Django, это дело оправдывают.
Начну, пожалуй, именно с текущего форума, который работает на движке PunBB. Когда я выбирал этот движок, главным его плюсом было то, что он не был огромных размеров конструктором всевозможных фич, которые можно и нельзя запихнуть под название "форум". Это маленький и аскетичный форум, как раз как мне нравится. И надо сказать, он, в общем-то, неплохо справляется со своими обязанностями.
Но и минусы меня слишком уж достают:
- Нет подключаемых плагинов. Есть "моды", которые поставляются с документацией в виде "сходите в этот файл на строчку номер 134 и заменить ее на такую-то". Это и в первый-то раз трудно делать, а при обновлении самого форумного движка придется делать все заново.
- Akismet-плагин довольно убого администрируется и плохо работает. То есть полно false positive'ов, и нельзя прошедшее спамное сообщение паметить спамом в целях обучения системы.
- "Прочитанность" сообщений отмечается не по факту их прочтения, а по времени последнего визита. То есть если я зашел на форум и начал отвечать на новые сообщения, то желательно, чтобы я это сделал быстрее 15 минут, потому что иначе те, до которых я не успел добраться, считаются уже прочитанными. Отстой!
- Извечные проблемы всех ascii-программ с интернационализацией. Кто бы мог подумать, что изменение языка интерфейса может сломать кодировку выдачи RSS-фида? А вот сломало: PunBB решил, что если язык форума английский, то содержимое обязано быть в западноевропейской кодировке...
- Написан на PHP, которого я не знаю, поэтому мне трудно в нем что-то исправлять.
Поэтому я уже какое-то время вяло думаю между "найти новый форум" и "написать новый форум". И в процессе этих размышлений у меня сформировался список фич, который, я почти уверен, не реализован нигде. Так что "написать" стало выигрывать. Подробности — чуть ниже.
Ну и последняя причина, по которой я таки буду его писать — это то, что я хочу сделать этот процесс публичным прямо у себя на блоге в качестве примера разработки типового веб-приложения на Django. Я не обнаглею настолько, чтобы называть это "учебником" (мне бы первый закончить :-) ), но я все же думаю, что многим это будет полезно или просто интересно. А тем, кто только присматривается к Django, позволит составить более четкое представление о фреймворке.
Регулярность постингов при всем желании обещать не могу, но определенно надеюсь, что они будут случаться довольно часто.
Описание того, что в форуме будет, я свел в небольшую функциональную спецификацию, которую привожу ниже. Она не вдается в подробности реализации, им я буду посвящать каждый отдельный пост по теме. Также она не является и окончательной: это мое видение минимальной функциональности, которую я хочу видеть в версии 1.0. Поэтому, прошу вас делиться в комментариях своими "rulezz"ами и "suxx"ами, дельными предложениями, а также тыканиями носом в очевидные ляпы. Должен, впрочем, сказать, что не берусь подробно прямо в комментариях реагировать на все предложения и описывать причины своего выбора. Часто это просто "потому что мне так нравится" :-).
А, вот еще... Форум называется "Cicero" в честь древнего римлянина, известного у нас как Цицерон. И известен он прежде всего ораторским умением, которое применял на всяких древнеримских форумах.
Cicero. Функциональная спецификация
Cicero — это софт для веб-форума. Главная задача этого форума — давать пользователям возможность задавать вопросы и получать ответы. А вот задача поддержки долгих дискуссий без особенной привязки к заданной теме как раз не ставится. Другими словами, это "форум-техподдержка", а не "форум-чат".
Основная аудитория форума — гики.
Структура
Топик и сообщения
Основная структурная единица — топик (он же — "тема"). Это набор сообщений, посвященный ответу на вопрос, решению проблемы, реакции на баг-репорт, деланию объявления и т.д. Топик создается человеком, который пишет первое сообщение, которое и задает тему. Дальше топик может дополняться сообщениями людей по мере необходимости.
Топик посвящается одной конкретной теме. Эта тема видна в виде заголовка топика. Сообщения внутри топика своих заголовков не имеют.
Форум должен поддерживать простое и легкое отделение в новый топик сообщений, уводящих топик от своей темы.
Сообщения, организованные в топики и форумы, составляют основное содержимое форума. Помимо него у форума есть еще неосновное содержимое: профили пользователей, административные странички и т.д.
Форумы
Разговоры вокруг одной общей тематики объединяются в Форум. Форумы могут объединяться в поименованные группы, но это не обязательно.
Поиск сообщений
Поиск сообщений идет по текстам сообщений.
Поиск должен работать. С русским языком, с игнорированием регистра букв. По возможности — понимать, что в русском языке у слов бывают склонения.
Постинг
Самое главное: textarea для написания текста должна быть большой!
Форма для новых топиков находится на странице форума, форма для ответов в топик — на странице топика. Отдельных "расширенных" страниц для них не предусмотрено
Система разметки текста по умолчанию — привычный многим BB-код. Но пользователь сможет выбрать другой синтаксис у себя в профиле. Пока единственным таким синтаксисом будет Markdown.
Менять синтаксисы должно быть можно хоть на каждом сообщении. Это нужно прежде всего для того, чтобы пользователю, обнаружившему другие синтаксисы, не пришлось конвертировать все уже написанные сообщения.
Интерфейс
Основной интерфейс форума похож на все остальные форумы: список самих форумов, в них постраничный список топиков, в них постраничный список сообщений. Но есть и несколько особенностей:
- отсутствие кучи отвлекающих деталей, что явно вытекает из отсутствия "игровых" фич вроде рейтингов, званий, подарков, подписей, смайликов и т.д.
- основной способ авторизации — написание сообщения, где вместе с текстом будем место для ввода логина; но отдельная страничка авторизации "просто так" тоже должна быть
- пользователю должно задаваться минимальное количество вопросов, от мелочных вопросов в духе "запомнить вас?" надо стараться избавиться
- подсветка кода через highlight.js
Ajax
Весь процесс обмена информацией между сервером и браузером должен быть построен на HTML-формах и ссылках, и работать в отсутствие Ajax'а и javascript'а. Если же ajax есть, то он должен подключаться к формам и ссылкам в тех местах, где это имеет смысл: а именно, где обновление малой части страницы быстрее и удобнее, чем перезагрузка ее полностью. Менять ajax'ом большую часть страницы — извращение.
Администрирование
Административные действия должны быть по возможности вписаны в основной интерфейс:
- кнопки для редактирования профиля рядом с ссылкой на залогиненного юзера
- кнопки удаления, редактирования, отщепления сообщения в новый топик в самом сообщениии
- кнопки назначения прав пользователя рядом с ссылкой на него
Функции, которые нельзя представить таким образом, будут поддержаны встроенной админкой Django.
Авторизация
Авторизация на форуме не обязательна, можно читать и писать без авторизации вообще.
Вместе с тем, авторизация поддерживается, и нужна для хранения пользовательских профилей. Авторизация происходит исключительно по OpenID. Если OpenID URL пользователя содержит данные в микроформате hCard, форум должен вытягивать оттуда ник, ФИО (вомзожно что-то еще).
OpenID — отвязная штука, но когда она выглядит просто как URL, это неинтересно. Поэтому OpenID пользователей должны интересно визуализироваться.
Pingback
Сообщения в форуме должны рассылать pingback по всем внешним URL'ам (в смысле, не внутрь форума), которые пользователи указывают в сообщениях.
Вместе с тем, сам форум не будет регистрировать пинги извне, в этом, кажется, не очень много смысла.
Conditional get
Форум должен отслеживать время изменения топиков и сообщений и использовать механизм Last-Modified/If-Modified-Since, чтобы не грузить базу и клиента генерацией и передачей неизменного контента.
Синдикация и APP
Создание, редактирование и чтение основного содержимого форума должно быть доступно через Atom Publishing Protocol — по сути стандартный машинный протокол чтения и постинга произвольного авторского контента в произвольные онлайн-коллекции.
Синдикация содержимого форума в формате Atom — часть реализации APP.
Антиспам
Форум должен пытаться не пускать спам, и одновременно пытаться не нагружать сильно внимание пользователей и модераторов к этому вопросу. В частности:
- вести "белый список" авторизованных пользователей, которые могут постить в форум без лишних проверок
- сообщения от неавторизованных или неизвестных пользователей должны проходить автоматические проверки (в частности ловушки для роботов и Akismet)
- сообщения, не посчитавшиеся спамом, должны попадать в форум
- спамные сообщения, прошедшие фильтр, нужно иметь возможность явно пометить спамом
Алгоритм предполагает, что в форуме таки может (и будет) оказываться спам. Это компромисс, потому что если так не делать, форум будет завязан на ручную модерацию, что не позволит ему иметь большой трафик.
"Белый список" OpenID пользователей будет предоставляться для публичного чтения, участвуя таким образом в децентрализованной базе "хороших" OpenID (см. social whitelisting). Также и сам форум должен иметь возможность подключать к себе аналогичные "белые списки" с других хостов.
Комментарии: 46
Гики замерли в ожидании :)
Она должна быть небольшой, но авторасширяемой при вводе текста. Как в гталке.
Идеи хорошие, будем наблюдать за процессом.
Наверное, стоит добавить вполне очевидное удобное цитирование предыдущих сообщений, и их частей. Но я уверен, что вы это планировали.
Про OpenID и hCard — замечательная мысль, несомненно требующая реализации!
Очень интересно. Буду следить.
Интересующие вопросы:
Извините, если сразу много, просто тема действительно интересна.
«сам форум не будет регистрировать пинги извне» — может стоит оставить эту фичу? Ведь на топики в форумах, особенно полезные, часто ссылаются.
Иван,
идея настолько мне понравилась что я хочу предложить свое участие в разработке (давно хотел сделать что-то с использованием Django, но, к сожалению, в последнее время круг моих задач лежит немного вне привычной веб-разрабортки).
Немного о себе: веб-разработчик с опытом, с python/javascript/ajax на ты :). С Django опыта не много, но, насколько я понимаю, это поправимло.
Если предложение интересно, то e-mail в комментарии :)
P.S. Очень понравился подход к разработке (а именно составление достаточно подробной функциональной спецификации), хотя некоторые моменты, на мой взгляд, можно обсудить.
Сам использую punbb уже около 1.5 лет. За полтора года движок почти не изменился, лишь иногда секурити патчи выходят. Согласен, что хаки для punbb - это ужасно, кроме того внутренняя архитектура движка тоже оставляет желать лучшего - вермишель из логики, кусков шаблонов и обращений к БД.
Сам хотел в том году писать движок на PHP, даже сайт замутил, думал, это простимулирует меня на работу, но потом процесс заглох ) Мои идеи по поводу форума я изложил тут: http://kolobb.org/forum/viewtopic.php?id=3, правда потом, подумав, я понял, что реализация движка, гибко поддерживающего плагины - довольно нетривиальная задача.
К настоящему времени, у меня есть реальная необходимость в python-движке форума для портала pydev.ru, поэтому я заинтересован в разработке.
Ой, как все это правильно. Буду внимательно следить за процессом.
Даешь форум с виртуальными папками! Теги в массы!
Это будет уродски :)
А как по поводу нумерации топиков? Каждому форуму свою нумерацию, или сквозную на всю толпу топиков?
Создать хороший движок форума, без идиотских графических смайликов, без получасовой загрузки страниц и прочего кретинизма, просто замечательная идея. Еще было бы неплохо, если бы он получил широкое распространение =).
Самый лучший форум, из тех, что я видел - http://ganjawars.ru/forum.php. Однако, недостатков хватает.
З.Ы. Если уж и отдавать записи через RSS не полностью, то было бы неплохо юзера об этом предупреждать... Ссылку что ли ставить на продолжение или многоточие в конце.
было бы не плохо забить в требованиях независимость от шаблонов (к сожалению часто встречается), а следовательно и поддержку валидности xHTML кода :)
а идея не нова и много копий было сломано, но как и сказано форумов много не бывает :)
Иван, ждём :)
Благодаря этому сайту я "подсел" на Django и забываю php как страшный сон.
Что может быть проще: реализовать загрузку отдельных элементов (сообщений, юзерских данных, названий тем или форумов) через Ajax. Чтобы, во-первых, каждый раз не грузился весь скелет, а во-вторых, можно было выбрать, сколько и каких элементов должны отображаться. Когда юзер, например, переходит вперед на 1 сообщение, скрипт удаляет один верхний контейнер вместе с сообщением и добавляет один (который уже загружен) внизу, куда и грузится новое сообщение. Все сообщения кэшируются (при обновлении сообщается только время в сжатом формате - соответственно, если сообщение было обновлено, грузится апдейт с отображением истории).
Плюс, для особо продвинутых гиков, предусмотреть возможность создания оффлайн-клиента типа janus/forumizer (вообще по интерфейсу здесь лучше ориентироваться на the bat, но пускай клиент пишут сами гики!) Это же значительная экономия трафика, а если что не так, то сделать поддержку еще и "плоской" версии.
Пока все, что я видел из форумных движков - отстой. Особенность PHP?
User:
Первый вопрос: зачем?
Второй вопрос: что делать с URL?
Третий вопрос: экономия трафика так уж важна?
Ух! Спасибо за ажиотаж :-). Отвечу на некоторые вопросы скопом.
Общие забытые мной в статье вопросы:
Про расширяемую textarea. Я не вижу минусов у просто большой textarea. Поэтому не вижу, что решит расширяемая. Поэтому не понимаю, зачем нужно усложнять простое решение.
Нет, не будет. У меня на сайте мне и группы-то не нужны (пока). Кроме того, Произвольная иерархия добавляет сложности в программировании (вместо того, чтобы оперировать предопределенными понятиями придется ходить вверх вниз по деревьям).
Пока права планируется только два: автор конкретного сообщения и админ.
Не будет. Это одновременно и не нужно мне в этой задаче (всегда можно дописать что-то в код), и сложно, потому что загодя не спланируешь, надо по ходу использования выяснять, где людям нужны плагины. А я хочу просто написать форум, большой проект вести не хочу.
Да, решение твердое. Честно говоря, ни разу не сталкивался у себя со сложностью модерирования... Ре-е-едкий топик у меня набирает больше 10 сообщений.
Нет, скорее "гиковские рюшечки". Уже припасена одна, связанная с OpenID :-)
Проблемы две: как их там показывать, и главное, кто их там будет читать? По опыту большинства пингов к комментариям этого блога, я вижу, что это скорее интересный мне как автору эго-бустер "вот на меня поставили ссылку". В форумном же топике толпа ссылок с разных сайтов "вот глянь, тут есть решение", мне кажется, не будет никому интересна... Нет?
Спасибо! Однако, я не вижу, как это можно вложить в формат проекта. Движок уже почти полностью сдизайнен, и большая часть времени у меня будет уходить, я думаю, на посты о коде, чем на сам код. Кроме того признаюсь, что идеи о многих фичах (или об отсутствии таковых) мне настолько дороги, что я просто не готов их обсуждать :-). А если я хочу все фичи написать сам, то потенциальным коллегам останется только исправлять за мной баги. Ну и кто я буду после этого? :-)
Тем не менее, если кому-нибудь будет не лень присылать мне патчи, фиксящие какие-то баги, буду страшно рад :-).
Впрочем повторюсь, код будет открыт.
Не думал про это с функциональной точки зрения... Сквозной номер (ID в базе) у них, конечно, будет. А разве нужна нумерация внутри форума?
Не очень понял, как это... Шаблоны там, конечно, будут отдельно от кода. А поскольку это Django, то я бы даже сказал сильно отдельно.
Кхм :-). Я, наверное, самый известный человек в рунете, довольно холодно относящийся к пользе XHTML, и DTD-валидации. Поэтому это практически невероятно :-).
Можно я отвечу прямо и в тон? :-) Проще — не через Ajax. То, что Вы описали — реально сложнее, чем ссылки. Не "сверхтрудно", а сложнее в системном смысле.
Экономия трафика и времени на передаче структуры будет копеечной. Структура не будет дико большой.
Но главное, это разрушает стандартный, знакомый, эффективный интерфейс веба и всю инфраструктуру вокруг него: от закладок до поиска. Делать это только ради модной технологии — не мой стиль :-). У каждого конкретного использования ajax'а должен быть конкретный смысл.
Ничего плохого в этой идее нет. Хорошего форума, в котором воплощены все современные толковые идеи, сильно облегчающие жизнь, попросту нет.
Иван, что касается Аякса, то он реально упрощает задачу и расскажу в чем.
Когда делаешь пост, то лучше бы ему появляться без перезагрузки страницы. Наверное неплохо было бы делать раз в минуту обновление новых постов в текущий топик.
В добавлении сообщения в топика — упрощает, у этого есть конкретный смысл. И скорее всего, там как раз ajax будет. А вот при добавлении, например, нового топика в нем смысла нет: надо уйти со страницы форума на страницу нового топика, и чтобы URL поменялся соответственно. То же самое при постраничном листании например.
Openid это хорошоо, хорошооо... Будешь свой писать или выдернешь из Zilbo'вского (http://svn.zyons.python-hosting.com/trunk/zilbo/common/openid/) ?
А почему не сделать топик как ленту в Google Reader, которая подгружает сообщения по мере просмотра? Вот уж ничто не раздражает так, как pagination.
поддержу pythy. Если не весь форум на тэгах, то хотя бы удобную работу с тэгами хотелось бы...
А как насчет WYGIWYS-редактора? (или как он там пишется...)
Re: Василий
_W_hat _Y_ou _S_ee _I_s _W_hat _Y_ou _G_et
WYSIWYG (=
Сильно подозреваю, что будет что-то вроде Showdown для коментов (;
Я у себя попробовал - неплохо, однако.
На developers.org.ua нет форума как раз из-за отсутствия хорошего форумного ПО. Недавно, правда нашел http://pocoo.org/ — но он тоже пре-альфа.
Можно хранить зависимости для всех пользователей для всех топиков.
По-началу это выглядит, как будто надо создавать огромную базу, но это не так.
Можно для каждого пользователя иметь запись (text или blob), где номер символа соответствует номеру топика. Таким образом одним символом можно "зашифровать" отношение юзера с топиком.
Обсуждение подобного здесь: http://www.sql.ru/forum/actualthread.aspx?tid=399774
вот люди используют самописный форум на питоне
http://www.python.promsoft.ru/index.php?action=forum
у них есть несколько уникальных фишечек
estapt
Кажется я чего-то не понял... Почему, если движок на питоне, все ссылки идут через index.php?
FX Poster
У меня вот, например, блог целиком на PHP, но все страницы имеют адрес вида /post_name.html
Расширение в общем случае ни о чем не говорит.
Иван Сагалаев
Иван, успехов вам в этом проекте!
Поддерживаю идею и минимализм :-).
Как только появится рабочая версия, сразу же начну прикручивать её к своему Twisted-based сайту.
..bw
Ну Вы же согласитесь, что это крайне странный способ маскировки форума [=
На том форуме прямо сейчас на первой странице висит топик "Движок форума на Питоне", где четко написано, что их форум написан на PHP.
[QUOTE]А как по поводу нумерации топиков? Каждому форуму свою нумерацию, или сквозную на всю толпу топиков?[/QUOTE] не, лучше чпу, как на dklab.ru :)
[QUOTE]Про расширяемую textarea. Я не вижу минусов у просто большой textarea. Поэтому не вижу, что решит расширяемая. Поэтому не понимаю, зачем нужно усложнять простое решение.[/QUOTE] лучше - авторасширяемая текстареа. тобишь, чтобы скроллинг в ней не появлялся.
Обычно сообщения типа "создаю свой форум, cms, ..." (особенно если на PHP - то вообще труба:) ) воспринимаю весьма скептически. Есть в этом како-то мальчишество, но только не в Вашем, Иван, случае :-)
Питон - отличный язык, и надобно его популяризовать, в том числе в вебе.
Желаю успехов в этом проекте, уверен, что у Вас получится очередной качественный продукт, т.к. Вы человек не только слова но и дела! Буду с интересом наблюдать за результатами.
"Но главное, это разрушает стандартный, знакомый, эффективный интерфейс веба и всю инфраструктуру вокруг него: от закладок до поиска. Делать это только ради модной технологии — не мой стиль :-). У каждого конкретного использования ajax’а должен быть конкретный смысл."
Я согласен, что это чуть посложнее очередного клона phpBB или rsdn. Но в то же время проблему с закладками можно обойти - реализовать внутри структуры ссылку на добавление специальной закладки (примерно как в Google Maps). Тут вообще все зависит от того, как планируется юзать форум. Для юзеров, от которых ожидается не очень высокий уровень ИТ-компетентности, вполне можно такое сбацать - как альтернативное представление (фиксированное, древовидное и динамическое).
Вообще, проблемы аякса - это проблемы браузера. Браузеры спроектированы изначально на просмотр статических документов, они пляшут от Location и Source code, а нужно работать с текущим состоянием страницы и динамическим урлом, который позволяет добиться такого ее состояния. Поэтому аякс и неудобен для гиков, но это не значит, что у него нет перспектив.
Лично я, потусовавшись по различным форумам, успел "заценить" убогость стандартного интерфейса "страница за страницей, по 10-15-... сообщений". Некоторые форумы содержат тематические данные, которые часто необходимо сохранить все вместе в оффлайне (те же варезники). Поэтому определенной части юзеров явно пригодится клиент или, скажем, гейт в ннтп - rsdn вот сами и распространяют клиент rsdn@home. Это как с почтой - кто работает эпизодически, тому веб, а кто постоянно, тому бат. Плюс ко всему редактор постов - еще более нужная вещь, хоть и приведет к цвето-шрифто-размерному беспределу. Опять же, главное - предназначение форума, у каждого движка свои особенности применения. И, в принципе, для начала лучше сугубо минимальный функционал сделать, если он будет работать, чем нечто навороченное и глючное. Мне вот больше по душе ru-board, чем пхпбб со стандартной темой. А как-то еще набрел на иноязычный форум с русским разделом - в один "прекрасный" день афтары не нашли ничего лучше, как конвертировать его из 1252 в юникод, в результате то, что получилось, ни в какой браузерной кодировке не отображается как надо. Речь о форуме Rejetto по &RQ. Так вот не мешало бы предусмотреть (мало где ЭТО окажется) в админке некоторые расширенные возможности перекодирования на уровне юзера.
Насчет форматтера текста. Нужен все-таки wysiwyg. Чтобы не замирать в ожидании того, во что превратится написанное, а сразу увидеть. Используя при этом BB и разные маркдауны.
(пред. комментарий залит по ошибке)
идея замечательная, с интересом буду наблюдать за ходом работ. у меня вопрос такой, если не XHTML, то, по крайней мере HTML и CSS планируется быть валидным? Вполне готов поучаствовать в написаниий шаблонов сайта (X)HTML, CSS, WAI и s508 совместимых.
Не... Я уже писал, почему DTD-валидация (и тем более CSS-валидация) — цель сама по себе довольно бесполезная. И я не стремлюсь к ней не потому что не умею (поверьте, умею :-) ), а как раз потому что цели у меня более широкие: отделение содержимого от оформления, корректная семантика, доступность. Это все можно делать только головой и руками, алгоритмически это не проверяется.
Собственно, поскольку HTML я надеюсь сделать достаточно хорошим, переделать его в XHTML, кому нужно, можно будет довольно легко.
Осмелюсь предложить заюзать готовую реализацию pingback-клиента:
http://geeksite.googlecode.com/svn/trunk/apps/blog/pingback.py (сам клиент)
http://geeksite.googlecode.com/svn/trunk/apps/blog/models.py (см. Entry.save(), Entry.ping())
http://geeksite.googlecode.com/svn/trunk/apps/utils/html.py (url_extractor)
Так есть же http://getvanilla.com/
Почти идеальный форум.
И снаружи и внутри все по понятиям.
Я его тогда, когда искал форум, чуть не поставил. Отказался потому что там была обязательная регистрация пользователей, что для нормального открытого форума губительно. Да и сейчас, думаю, там много чего нет из мной перечисленного.
Фичареквест:
Как насчёт одноразового пароля?
Примерно так: http://artreal.exler.ru/readme/11.03.2007/parolnajak
А меня Ванилла обманула. Там и впрямь незарегистрированные пользователи писать не могут. Правда, потихоньку делается некрасивый патч http://lussumo.com/community/discussion/3908/2/guestpost-v13/
Хотелось бы работающего поиска и как раз таки возможность писать анонимным пользователям. Думаю, я как раз успею немного разобраться с пайтоном к моменту первого релиза :) Удачи.