Белогривые лошадки

26.09.2007 12:42
Я монетизировался, ура. Подробности в конце поста.

Про облако тэгов хотелось бы понудеть.

Движки, которые выводят облако тэгов на каждой странице, не кэшируя его — ущербны. Например, Wordpress генерирует страницу «пост с комментариями» с помощью 28 (!) запросов к базе данных. Поэтому посещаемые сайты на wordpress-е (не будем показывать пальцем) тормозят безбожно.

Совершенно же логично, что для генерации поста с комментариями — например, в этом блоге — нужно максимум три MySql запроса: 1) вывод поста, 2) вывод комментариев, 3) вывод навигации «Вы сейчас здесь».

Облако тэгов, само по себе — идиотская идея и ненужная фигня, типа календарика. Основная ее «фишка» в том, чтобы вывести список и по алфавиту и по «важности» (выделив это размером).

Тут и кроется самый смешной нюанс — тэги у всех разные. Натурально, разные слова. Начинаются на разную букву. У кого-то ключевое слово «имбецилы», у кого-то — «идиоты», а тема-то одна и та же. Не говоря уже о том, что везде наблюдается смесь английского и русского, которая довольно нелепо сортируется по алфавиту.

От сайта к сайту «оно всё разное». Запоминать ваши тэги/ключслова ни один посетитель не будет, не обольщайтесь. Сортировка по алфавиту бессмысленна.

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

«Там решено было цветом выделять последнее, хорошая мысль» — мысль вовсе не хорошая. Цветом нужно выделять только посещенные ссылки. Это принятно, интуитивно понятно, и, что самое главное — это гораздо полезней. Разноцветные ссылки — никому не понятное уебище. Даже если и подписано «Bright Color = Newer» — я захожу на сайт читать, а не оттенки цвета угадывать.

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

Никому никогда не интересны все ключслова. Потому что часто бывает ситуация, когда есть «случайные» ключслова, принадлежащие одному-двум документам.

Как надо

В своем личном блоге проще всего отобрать штук пять ключслов, которые «наиболее характеризуют». И разместить их любым удобным способом. Например, как у меня справа. Вам самому безо всякой «автоматизации» лучше знать, какие ключслова «круче», без привязки к их частоте.

На массовых «социальных сервисах» облако тэгов неинформативно, но нужно для того, чтобы круто выглядеть, и чтобы пальцем не показывали. И для того, чтобы направить леммингов по ими же протоптанной тропинке. В этом случае можно вместо «букав» просто использовать прямоугольники разных размеров и цветов, так как кликнут все равно на тот, который больше. А надписи никто не читает.

Bonus track

Хранить тэги в таблице надо так:

1. В таблице с постами. Отдельное поле «ключслова через запятую».
2. В отдельной таблице связей, которая имеет вид «ID поста — ID тэга».

Это не два способа, а один, то есть хранить надо и так и так одновременно. Ценой небольшой избыточности информации мы получаем гораздо больший простр для. Минус только один: при редактировании надо редактировать и то и то, разумеется.

И про баб

Весь следующий месяц меня монетизирует cайт бесплатных знакомств. Не знаю, видели ли вы его, но я уже раз в пятый натыкаюсь. Лемминго-ориентированный интерфейс (это плюс), две кнопки «я б ей вдул» и «сам ей вдуй!».

Мне интересно — стоит ли за этим какой-нибудь хитрый алгоритм, или просто rand()? Был же где-то сайт, на котором тебе показывают картинки, а ты выбираешь «нравится» или «не нравится», а в конце о твоей личности делают некие выводы. Находят латентную пидерастию, например.

Вдруг и там так же?

На эту заметку ссылаются:

  • Пост с комментариями
    vkv
    сломал себе все мозги, но так и не понял, причем тут лошадки.
    провокация второго уровня, чтобы заставить ткнуть в монетизирующую ссылку интеллектуалов?

    Автор ответил:
    Ya.ru -> «белогривые лошадки».

    У тебя детство было, да?

    vkv
    ааааа, блака. да. туплю.
    на я.ру на всякий случай тоже кликать не стал

    Автор ответил:
    Надо было назвать «секс с белогривыми лошадками». Люди любят секс в заголовках.
    > Начинаются на разную букву. У кого-то ключевое слово «имбецилы», у кого-то — «идиоты», а тема-то одна и та же.

    Как-то тут неубедительно вышло :-)

    Автор ответил:
    Думаешь, заметят?
    Alexey
    Что-то недопонял с таблицами. Зачем? Явно избыточный метод хранить тэги в двух способах. Ладно, у Лехи там своя заморочка — решил сделать все на одной таблице, но в идеале-то оно зачем?

    По мне, так вполне достаточно хранить теги в отдельной таблице, а связывать с постами через таблицу связей (т. е. твой 2 способ). А так, к примеру, простое переименование тэга повлечет за собой необходимость правки всех постов, в которых он присутствует… Или нельзя поставить спец. флаг и просто скрыть какой-либо тэг (ну например, в том же облаке нет смысла показывать тэг, привязанный только к одному посту), чего, кстати, в ЖЖ нет…

    P. S.: Жестко ты с посетителями… «Лемминги» )

    Автор ответил:
    Переименование тэгов тут совсем не при чем, так как тэги и их связи (между собой, а не между заметками) хранятся отдельно: http://nudnik.ru/img/kw.png

    У меня просто хитрым способом сделано: при выводе тэгов, рубрик и прочего дополнительная таблица не дергается и дополнительные запросы не создаются. Типа такого: http://nudnik.ru/entry/1492 В «регистре» вообще были все эти ключевые слова без базы данных вообще.

    То же самое и с количеством комментариев — никто не сомневается, что хранить их надо так же.

    Но вообще да, второго способа должно хватить большинству. =) Просто сразу появляется соблазн считывать их отдельным запросом. Как иначе объяснить по 20+ запросов на страницу — я не знаю.

    А лемминги — очень милые грызуны.

    Alexey
    Ух! Вот это заворот с тэгами! Нет, я, конечно, догадывался, но чтобы вот даже так…

    И что, по-честному, оно себя оправдывает? По-моему, тэги по определению второстепенны, стоит ли тут структуру наворачивать?..

    А 20 запросов на страницу получилось скорее всего из-за огромного количества разнообразных служебных запросов. Я раньше тоже возмущался по этому поводу, но когда сам окунулся, понял, что тут очень непростой компромисс: между функциональностью и количеством запросов иногда почти прямая зависимость…

    Кэш — панацея ;)

    Автор ответил:
    Да там «вся структура» — пять лишних строк кода.

    Функциональность-то одна и та же: блог с комментариями. Откуда там wordpress столько запросов берет — я не знаю.

    Ну и кэш не панацея, хотя вещь хорошая.

    Илья Бирман меня опередил.

    Я с первого раза заметил, только прочитал позже.

    А чё, в вордпрессе появились теги уже? В последней версии были только категории, но вы меня извините — категориями теги эмулировать я не буду.
    А вообще для навигации надо выводить только топ-теги (которые не входят в состав других тегов) + теги-одиночки, если они имеют соизмеримое количество записей.

    P.S. Дима, а зачем мне на почту приходят _мои_ комментарии? Может, только чужие надо присылать?

    Автор ответил:
    Вот тебе облако тэгов. http://nudnik.ru/img/kw.png (Ключслова по связям).
    Только его надо на 90 градусов повернуть по часовой стрелке. И отсортировать не по алфавиту, а по частоте.
    .
    А почему этот пикред, когда заходишь, не определяет пол автоматически?

    Автор ответил:
    У женщин определяется.
    Дмитрий Смирнов 2.0 RC
    (громко смеется, тыкает пальцами) У нас в джавовских проектах за количеством запросов в общем случае никто не следит. Ну, генерит эта самая джава где-то там по сотне запросов на страницу, ну, что поделаешь. Тысячи пользователей в один момент обрабатывает, и не жужжит, чо.

    Автор ответил:
    Ага, щас.

    Если бы на shared-хостингах «за 10 баксов» везде вместо php стояла бы java, то оно раком вставало бы всё даже чаще, чем сейчас.

    Demon
    > Ну, генерит эта самая джава где-то там по сотне запросов на страницу, ну, что поделаешь.

    Hibernate что ли?

    Дмитрий Смирнов 2.0 RC
    Автор
    Не факт. Java кешировала бы все по-умному.

    Demon
    Не обязательно. EJB тоже.
    Да, я не пишу на чистом JDBC и другим не желаю.

    Автор ответил:
    Я как-то видел портал, на Яве писанный. Так там чат загнулся при 20 посетителях и положил весь сервер. Тоже о запросах не думали, гыгыгы.
    Demon
    > EJB тоже

    Ты хотел сказать Persistence API?
    Hibernate — говно, кстати.

    Блядь, ну как в топике про облако тегов можно умудриться развести околоджавовый holy war?

    Автор ответил:
    Да ужас, сначала вообще про лошадок пытались флейм развести.
    Demon
    > Тоже о запросах не думали, гыгыгы.

    Hibernate, например, не позволяет думать о запросах. В результате выборка 100 записей из таблицы может выглядеть как 100 запросов по одному ряду. Смотрел на это и не знал, что и думать.

    Дмитрий Смирнов 2.0 RC
    Demon
    Не нужно бросаться умными словами. Persistence API — часть EJB3, а я еще и EJB2.1 имел ввиду, ага.
    Persistence API, кстати, построен на Hibernate, который гавно (а что не гавно? чистый JDBC?).

    Автор
    Небось, загнулся он потому, что чат был построен на Java-applets и разработчики не подумали о потоках.

    Дмитрий Смирнов 2.0 RC
    Demon
    Hibernate, например, позволяет думать о запросах. Читайте документацию.
    Demon
    > Не нужно бросаться умными словами.

    Да я тут не вижу никаких умных слов. Ну и я вопшемта вопросы задавал, а не словами бросался. Видишь у меня там знаки вопроса стоят? То-то же!

    > а что не гавно?

    ADO.NET. Только не упади -)

    > Hibernate, например, позволяет думать о запросах.

    Это ты про native SQL что ли? (Вот видишь. Ты так непонятно пишешь, что постоянно приходится спрашивать всякое.)

    Demon
    > Persistence API, кстати, построен на Hibernate

    Это откуда такие сведения, кстати?

    > То же самое и с количеством комментариев — никто не сомневается, что хранить их надо так же.

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

    SELECT [bla-bla-bla], count(if(posts.id = comments.post_id, 1, NULL)) FROM posts, comments WHERE [bla-bla-bla]

    Автор ответил:
    А кто говорит, что нельзя? Просто таблица комментариев будет дергаться каждый раз. Чего можно легко избежать, «потратив» два килобайта максимум.

    Домашнее задание: отсортировать посты по количеству комментариев.

    Active record лучше.
    > Домашнее задание: отсортировать посты по количеству комментариев.

    Очевидно: добавить в конец запроса ORDER BY N DESC, где N — номер «столбца» count(if(…)) в запросе.

    > SELECT [bla-bla-bla], count(if(posts.id = comments.post_id, 1, NULL)) FROM posts, comments WHERE [bla-bla-bla]

    Только непонятно, чем такой «один запрос» будет оптимальней, чем первоначальные три. (Да, я знаю, на 10% быстрее. Но вариант с избыточностью — на 200% быстрее.)

    Дима, а bonus track был с самого начала? я просто на этих выходных как раз реализовал именно такой вариант: таблица связей + кеш поле в таблице записей, хотя изначально и не собирался делать этот кеш. Эта избыточность себя оправдывает совершенно.

    Автор ответил:
    Bonus track существует уже года три. Даже больше, если брать в расчет мою CMS.

    Оправдывает, оправдывает. Я о чем и говорю.

    Я не знаю, что такое «на 200% быстрее» :)

    Недостатки такой избыточности очевидны: необходимо везде вставлять UPDATE, где может меняться общее количество комментариев.

    Конечно, существуют ситуации, когда такая избыточность оправдана (например, преобразования id url). Однако дополнительно хранить количество комментариев не стоит.

    Автор ответил:
    Везде — это в одном месте в виде функции? =)
    woofer
    А какие именно сайты на WordPress тормозят и не тормоза ли это внешнего канала хостера. Как вы видите, что это именно тормоза движка. Примеры в студию :)_

    Автор ответил:
    У вордпресса есть дурная привычка выводить в html-е в виде комментариев время генерации и количество запросов. Так вот, когда время генерации — 5 секунд, дело вовсе не в канале.

    Apazhe.net иногда лежит с «CPU quota exceeded». Это тоже явно не канал.

    В таблице с постами я бы хранил не простые теги через запятую, а оформленные ссылками.

    В таблице с тегами хранил бы количество связанных постов, чтобы потом выводить его в скобочках и сортировать теги по частоте.

    > В этом случае можно вместо «букав» просто использовать прямоугольники разных размеров и цветов, так как кликнут все равно на тот, который больше.

    Браво!

    Есть такой зарубежный сайт hotornot.com, но там оценка по десятибальной шкале.
    (полистав пикред) Причем русский вариант сосет по всем показателям.

    Даже скопировать не могут нормально, идиоты.

    Дмитрий Смирнов 2.0 RC
    Demon
    А, дотнетчик. Предупреждать же надо!
    Я о джаве говорю, да. там Hibernate, а не nHibernate. Говно ли nHibernate — не знаю, вполне может быть что гавно, как и весь дотнет.
    Demon
    > А, дотнетчик.
    Сам дотнетчик!!!

    > Я о джаве говорю
    Вот и я о ней. Ты читай внимательно, если что непонятно — спроси.

    > там Hibernate, а не nHibernate
    Что то, что это — одинаковое говно.

    Дмитрий Смирнов 2.0 RC
    Если мы о джаве, то что за дурные вопросы и категоричность в суждениях?
    zg
    так джава по определению — говно. её педофил придумал.
    Demon
    > Если мы о джаве, то что за дурные вопросы и категоричность в суждениях?
    Да ты чо! Категоричность в суждениях, говоришь? Ща я тебе покажу категоричность в суждениях. И вопросов не буду задавать, хуле.

    > Persistence API, кстати, построен на Hibernate
    Вот это, например, откровенная чушь, заставляющая усомниться в адекватности автора.

    > Hibernate, например, позволяет думать о запросах.
    Это тоже пиздеж. Потому что если использовать native SQL, то непонятно нахер было вообще брать Hibernate. Кстати, отличной характеристикой этого гибернейта является как раз наличие native SQL: мы хотели абстрагироваться от базы данных, но у нас ни хера не вышло.

    > Небось, загнулся он потому, что чат был построен на Java-applets и разработчики не подумали о потоках.
    Это вообще шедевр. Если слать 100 запросов в 2 потока по 50 в каждом — это в 2 раза снизит нагрузку на сервак! Занимательная потоковая арифметика для тупых. Плакалъ.

    Дмитрий Смирнов 2.0 RC
    Demon

    > Вот это, например, откровенная чушь, заставляющая усомниться в >адекватности автора.
    У EJB3 очень много взято из Hibernate, ага.

    > Это тоже пиздеж. Потому что если использовать native SQL, то >непонятно нахер было вообще брать Hibernate. Кстати, отличной >характеристикой этого гибернейта является как раз наличие native >SQL: мы хотели абстрагироваться от базы данных, но у нас ни хера >не вышло.
    Конфигами и тд Hibernate таки можно настроить, чтобы он составлял примерно те запросы, что нам нужно.

    > Это вообще шедевр. Если слать 100 запросов в 2 потока по 50 в >каждом — это в 2 раза снизит нагрузку на сервак! Занимательная >потоковая арифметика для тупых. Плакалъ.
    Если сервер обрабатывает все запросы от всех апплетов в одном своем потоке — да, он может загнуться.

    Автор ответил:
    Да вы заебали.
    Demon
    > У EJB3 очень много взято из Hibernate, ага.
    «Взято из» и «построен на», это как бы совсем разные вещи, ты не находишь?

    > Конфигами и тд Hibernate таки можно настроить
    Ну так. Вместо SQL получаем HQL, который дальше нужно доводить некомпилируемыми конфигами, причем не факт, что получится. Это и есть 100% чистый навоз.

    > Если сервер обрабатывает все запросы от всех апплетов в одном своем потоке — да, он может загнуться.
    Откровенную чушь-то не надо писать. Если бы сервер обрабатывал все запросы в одном потоке, то это был бы очень тормозной сервер, который бы никогда не падал. Ты вообще в курсе… я не знаю… жизненного цикла сервлета, например?

    > Везде — это в одном месте в виде функции? =)

    Ясно, что в виде функции. Но функцию эту нужно вызывать, как минимум, когда посетитель оставляет комментарий, когда комментарий делается невидимым/видимым или удаляется в админке.

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

    Автор ответил:
    Ну, вот ты все два случая и перечислил. =)
    Дмитрий Смирнов 2.0 RC
    Demon
    первые два пункта замнем для ясности.
    > Откровенную чушь-то не надо писать. Если бы сервер обрабатывал все запросы в одном потоке, то это был бы очень тормозной сервер, который бы никогда не падал. Ты вообще в курсе… я не знаю… жизненного цикла сервлета, например?
    Представь, сервер тормозной, а мы в апплете поставили, что если сервер не отвечает 5 секунд, мы запрос переотсылаем.
    И сервелеты тут ни при чем, нафиг тут сервлеты ваще?

    Автор
    > Да вы заебали.
    А ты отпишись от комментов!

    Автор ответил:
    Да я лучше вас отпишу.
    Demon
    > Представь, сервер тормозной, а мы в апплете поставили, что если сервер не отвечает 5 секунд, мы запрос переотсылаем.

    Понимаешь, такие пассажи, они только выдают твою некомпетентность.
    1) Если сервер не отвечает — значит он уже лежит.
    2) Есть такая вещь — timeout называется.
    3) Слать запросы через каждые 5 секунд — это реализация стратегии типа «баран».

    > И сервелеты тут ни при чем, нафиг тут сервлеты ваще?
    Жизненный цикл сервлета хорошо иллюстрирует то, как устроена обработка запросов на сервере с точки зрения мультипоточности. Поэтому

    > Если сервер обрабатывает все запросы от всех апплетов в одном своем потоке — да, он может загнуться.

    - это бред.

    Demon
    > Да я лучше вас отпишу.

    Это еще почему? Тебе что места в БД жалко?

    > Это еще почему? Тебе что места в БД жалко?

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

    Demon
    > это как бы невежливо.

    Это с каких херов? Все только этим и занимаются!

    Дмитрий Смирнов 2.0 RC
    Demon
    > 3) Слать запросы через каждые 5 секунд — это реализация стратегии типа «баран».
    Мне кажется, ты забыл, о чем мы тут разговариваем. Я напомню. Мы обсуждаем кривой чат, который падал на 20 пользователях. Я тебе говор: «он мог упасть, потмоу что у разработчиков руки кривые, и они могли написать так-то и так-то». А ты мне: «да нет, у разработчиков руки не кривые, они же не бараны!». Ну, и где тут логика?
    Дмитрий Смирнов 2.0 RC
    > Жизненный цикл сервлета хорошо иллюстрирует то, как устроена обработка запросов на сервере с точки зрения мультипоточности.
    И да, если ребята писали сами свой сервер (что вполне логично, там же просто чат), они могли и не знать, как там жизненный цикл сервлета выглядит и тп. Еще раз: мы говорим о чьем-то кривом софте. Если ты знаешь, как оно там было написано и почему падало — расскажи, не томи.
    (Видимо, три месяца включённых комментариев подошли к концу.)
    (Видимо, три месяца включённых комментариев подошли к концу.)

    Я поэтому и попытался их урезонить. Не внемнут.

    Demon
    > они могли и не знать, как там жизненный цикл сервлета выглядит и тп

    Вот ты — не знаешь, да. Если бы ты знал — ты бы ничего не говорил про однопоточную обработку запросов, которая, якобы, кладет сервак.

    > Мне кажется, ты забыл, о чем мы тут разговариваем. Я напомню. Мы обсуждаем кривой чат, который падал на 20 пользователях.

    Это ты забыл. Мы говорим о том, что половина java-related технологий — говно (см. Hibernate). Падение чата на 20 пользователях — это просто иллюстрация говнистости.

    > И да, если ребята писали сами свой сервер (что вполне логично, там же просто чат)

    Что, свой сервер приложений специально для чата писали? То есть по-твоему это нормальное предположение? [истерически ржет, падает под стол] Не, с меня хватит, я больше не буду этот бред обсуждать.

    Demon
    > Не внемнут.

    Чо?

    Не внемлют, йопт.

    Совсем своими сервлетами моск затрахали.

    Дмитрий Смирнов 2.0 RC
    Demon
    > Что, свой сервер приложений специально для чата писали? То есть по-твоему это нормальное предположение? [истерически ржет, падает под стол] Не, с меня хватит, я больше не буду этот бред обсуждать.
    Да, єто нормальное предположение, поверь мне.
    Дмитрий Смирнов 2.0 RC
    И да, я с большим нетерпением жду откровений о том, какое отношение имеет _жизненный цикл_ сервлета к многопоточности.

    Автору: если хочешь, мы ко мне в ЖЖ перейдем около джавы сраться. В принципе, давно пора.

    > мы ко мне в ЖЖ перейдем

    Аллилуйя! Ребята, ну нельзя же так, в самом деле. Закроет Дима комменты, и всё, опять придётся синдикацию комментировать.

    Demon
    > мы ко мне в ЖЖ перейдем около джавы сраться.

    Точно. Иди к себе в жж и там устраивай цирк с конями.

    Дмитрий Смирнов 2.0 RC
    Demon
    > Точно. Иди к себе в жж и там устраивай цирк с конями.
    Ггг, ага, по типу того, какое отношение имеет жизненный цикл сервлета к многопоточности.
    Demon
    > какое отношение имеет жизненный цикл сервлета к многопоточности

    Вижу я, вижу, что ты об этом сегодня, наконец, прочитал и ничего не понял. Объясняю: каждое обращение к методу service является частью жизненного чикла сервлета и происходит в отдельном потоке. 10 обращений — 10 потоков. Похожим образом работают jsp, web services и т.д. То есть «сервер обрабатывает все запросы от всех апплетов в одном своем потоке» — это чушь несусветная.

    Короче, ты меня уже задолбал своим невежеством. До новых встречь.

    Дмитрий Смирнов 2.0 RC
    Demon
    Сервлету похер, дергают его в отдельном потоке или нет. У него есть метод service — и все. А будет этот метод дергать один и тот же поток (что можно выставить в настройках сервера приложений) или куча разных — это сервлет не волнует. Это называется «Хороший дизайн».
    Продолжай кидаться прочитанными фразами из учебника «Джава для полных идиотов за 180 дней» дальше.
    Demon
    > Demon

    Я же сказал — свободен. Ты даже для флейма слишком туповат.

    Дмитрий Смирнов 2.0 RC
    Гггг

    (Всё-всё, автор, это последний комментарий)

    Автор ответил:
    А теперь поцелуйтесь!
    bealex
    А потом пришел лесник и выгнал всех из леса.

    Не, Дима, коммент я напишу, но по Java выскажусь лучше в другом месте. Удержусь. Еле еле. Но удержусь. :)

    Автор ответил:
    Не стесняйся, все равно этот тред засрали уже.
    bealex
    Не, серьезно, слишком много мыслей по этому поводу накопилось за много лет. Аргументы типа «сам дурак» тут уже есть, а фраз про то, что программу пишут не API, а таки программисты — видимо (судя по комментам) не поймут.

    Для тебя могу сказать, что у меня на Java написан код игры. Там на Java чат/боёвка/инфа о персонажах и еще какие-то лабиринты. Проект не мой, я помогал делать, и сделан не идеально. Но пару сотен пользователей и несколько тысяч ботов держит, не жужжит… Так что чат, что ты видел, написан тем же быдлокодером, что и «тырнет магазин, сам пысал, за тры дня».

    Можно хорошо писать даже на лиспе или прологе. Если думать.

    Дмитрий Смирнов 2.0 RC
    bealex
    > программу пишут не API, а таки программисты
    Я эту мысль и пытался высказать. И предлагал ответ: «программисты тупые, например, они могли думать так-то и так-то». Меня не поняли, естественно.
    Demon
    > программу пишут не API, а таки программисты
    Мы сейчас делаем довольно большой проект для одной очень крупной компании. У них там, естественно, есть свой IT-отдел, который продавил следующие технические решения: Hibernate, Spring, JSF, Portlets. Идти против заказчика, как ты понимаешь, можно далеко не всегда. Вбили они себе в голову, что им нужны edge-cutting enterprise solutions – все, тушите свет. Hibernate тормозит, Spring тормозит, JSF слишком сырой – клиентщики словили пару отличных граблей из-за его багов, с портлетами JSF скресить получилось только через жопу. Закономерный итог: показ попапа с подсказкой занимает 10 секунд, потому что при этом отправляется около 30 запросов в базу. Это не потому что мы так написали, это потому что так вот работают все эти замечательные API.

    Так вот. Программу пишут, конечно, программисты. Однако выбор API существенно влияет на. А поскольку до хрена леммингов пребывают по воздействием заклинаний типа «enterprise», «abstraction layer» и т.д., то выбор эих API как правило – чудовищен. Поищи на job.ru по ключевому слову Hibernate или Struts – много интересного узнаешь.

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

    > Можно хорошо писать даже на лиспе или прологе. Если думать.
    [морщится] Пролог-то сюда зачем приплетать? Cпецифический язык со специфической областью применения.

    Дмитрий Смирнов 2.0 RC
    Demon
    Давай я тебе покажу проект, над которым работаю я. Hibernate, Spring, JSF, Oracle. Проект выдерживает тысячу пользователей одновременно, будучи запущенным на одном сервере.
    Дмитрий Смирнов 2.0 RC
    PS Да, проект тоже крупный и для очень крупной компании.
    Demon
    > Hibernate, Spring, JSF, Oracle. Проект выдерживает тысячу пользователей одновременно, будучи запущенным на одном сервере.

    Ты это… ври-ври, да не завирайся. 1000 одновременных запросов уронят, например, jboss.
    Типичная практика — порядка 50 пользователей на сервер, несколько серверов, лоад балансер.

    > Давай я тебе покажу проект, над которым работаю я.

    Покажи.

    Дмитрий Смирнов 2.0 RC
    Demon
    Там Tomcat, JBoss здесь нафик не нужен.
    Я тебе говорю цифру, которую мне QA сказал, он тестировал на нагрузку, не я.
    http://helmetstohardhats.org/

    Автор, сотри мой комментарий после прочтения, пожалуйста.

    Дмитрий Смирнов 2.0 RC
    Хехе, там еще не рабочая версия дежит, какая-то заглушка на ASP. Короче, как выложат, я маякну.
    Demon
    > Там Tomcat, JBoss здесь нафик не нужен.
    Какая разница. Tomcat — часть Jboss.

    > Я тебе говорю цифру, которую мне QA сказал, он тестировал на нагрузку, не я.
    Так не говори, если не знаешь!
    Если интересно, вот познавательная статья про load balancing для Tomcat — http://people.apache.org/~mturk/docs/article/ftwai.html

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

    Дмитрий Смирнов 2.0 RC
    Demon
    > Какая разница. Tomcat — часть Jboss.
    И что дальше? А еще там есть log4j, так что теперь, что JBoss, что log4j — похер?
    > Так не говори, если не знаешь!
    Я знаю, о чем я говорю. Тестировалось без load balancing, на одном сервере.
    > Примерно я понял. По сравнению с тем, что делаем мы, это — маленькое и простое приложение.
    (смеялся)
    Demon
    > А еще там есть log4j, так что теперь, что JBoss, что log4j — похер?
    Это говорит только о том, что ты не знаешь устройство Jboss.

    > Я знаю, о чем я говорю.
    Бугага. Все твои посты с самого начала — это демонстрация потрясающего невежества.

    Учи матчасть, короче.

    Дмитрий Смирнов 2.0 RC
    Demon
    > Это говорит только о том, что ты не знаешь устройство Jboss.
    Да-да. Это ведь я сказал о том, что нет разницы, что мы используем — JBoss или Tomcat.

    Зажигай дальше.

    На счет получения количества комментариев я написал действительно не оптимальный способ.

    Вот так будет гораздо лучше:

    SELECT [bla-bla-bla], (SELECT count(*) FROM comments WHERE posts.id = comments.post_id) FROM posts WHERE [bla-bla-bla]

    Поле post_id в таблице comments делается индексом. Тогда внутренний запрос к этой таблице не обращается вообще, использует только индекс.

    frd
    Дим, ты когда выводишь 10 последних постов на странице, ты теги берешь из той же таблицы, где посты и просто обрабатываешь их регэкспом или ты всё же берёшь их из таблицы где есть id.post и id.tag?

    Автор ответил:
    Из той же таблицы, где посты.
    Чтобы комментировать, надо войти или сначала зарегистрироваться.
    А если у вас есть OpenID, это еще проще: