You are viewing ash108

youtube на harekrishna.ru

May. 2nd, 2011 | 02:43 pm

Встраивание видео с youtube теперь работает и с кодом по умолчанию (iframe). Раньше работало только если ставить галочку “Use old embed code”.

Это уже используется, в некоторых свежих видео, например, в этой лекции Госвами Махараджа.

Link | Leave a comment {1} | Share

юникод, диакритика и встраивание шрифтов в статьях

Apr. 30th, 2011 | 10:13 pm

Садху Прия Прабху недавно нашёл шрифт Charis SIL, где достаточно грамотно сделаны Diacritics combining marks. В связи с этим начинаем публиковать материалы с русской диакритикой: например, последние две статьи Гурудева Традиш уже опубликовал с диакритикой в санскритских стихах.

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

А теперь — wait and see, как говорил Шрила Шридхар Махарадж. Посмотрим что из этого выйдёт и будут ли благодарности или проклятия или хоть какие-то отклики.

UPDATE: В редакторе новостей теперь тоже новый шрифт встраивается.

Link | Leave a comment | Share

Старые длинные новости

Apr. 10th, 2011 | 06:44 pm

Сделал доступными новости, у которых раньше были очень длинные адреса (более 255 символов)и включил редиректы на канонические адреса новостей.

Поскольку адреса новостей основаны на заголовке (только с переводом в латиницу), то у некоторых новостей получались очень длинные адреса: более 255 символов в одном сегменте. У апача (или какого-то из его модулей), похоже, есть баг, из-за которого он пытается сделать stat() файла с путём и именем как в запросе, и когда в имени файла больше 255 символов, он возвращает невнятную и неперехватываемую ошибку 403. На serverfault уже уже пару раз этот вопрос поднимали (здесь и здесь), и оба раза внятного объяснения не было. Теория понятна, но непонятно зачем апач (или какой-то модуль) пытаются делать stat() URL-а. Этот баг даже в базе апача уже несколько лет как есть: https://issues.apache.org/bugzilla/show_bug.cgi?id=45187. Но, кажется, разработчики не спешат его исправлять: мол, всё равно длинные URL-ы это моветон.

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

Теперь, например, новость http://harekrishna.ru/2005/01/1116-govoryat-kak-vstretish-novyi-god-tak-ego-i-prozhivesh-predannye-i-gosti-moskovskogo-kulturnogo-centra-shri-chaitanya-sarasvati-vstretili-2005-god-ulichnoi-sankirtanoi-shestviem-proslavlyayushim-svyatye-imena-gospoda-shestvie-proshlo-srazu-posle.html стала доступна. У неё заголовок больше 300 символов и раньше адрес был недопустимо длинным и попытка её открыть выдавала служебную страницу «Ошибка 403». А сейчас заголовок для адреса обрезается на пробельном символе, чтобы длина сегмента была не слишком большой.

Также сделал при показе новостей редирект на канонический URL. Давно знал что так надо (для защиты от SEO-отравления, например), но руки не доходили. А недавно увидел, как один человек сослался на адрес http://harekrishna.ru/news/2009-1.php/4359?id=4359. Адрес работающий, но по адресу сложно сказать что находится по ссылке, в отличие от канонического адреса той же самой лекции: http://harekrishna.ru/2009/01/4359-ekadashi-mpr-7-5.html (это лекция об Экадаши из Мгновений Прекрасной Реальности). А теперь обращение по первому адресу молча переносит на второй (HTTP 302).

Link | Leave a comment | Share

Выборка но нескольким меткам и SQL

Apr. 9th, 2011 | 04:22 pm

Где-то там в далёких галактиках, говорят, звёзды падают в чёрные дыры. Ух... Но пусть себе падают. Важнее, что на сайте теперь работают сложные запросы по меткам. :)

Примеры:

  • если Вайшнавский фестиваль–2010 это /tag/1406, а Госвами Махарадж это /tag/2, то по адресу /tag/1406+2 можно увидеть материалы где есть обе этих метки.
  • а, скажем, по адресу harekrishna.ru/tag/23+1 видны все лекции Авадхута Махараджа в Киеве.
  • А по этому адресу — материалы по этому фестивалю кроме лекций («заминусованы» некоторые метки вида «Автор: ...»).

Ну и адреса подправил: материалы по меткам теперь показываются по адресу /tag/xxx, а не /news/?tag=xxx

Это может быть полезно само по себе, но это также подготовительная работа к переделыванию страниц с большими циклами материалов. Т.е. в итоге хочу сделать, чтобы материалы, например, Вайшнавского фестиваля-2010 показывались не просто как большой список непонятного текста, а чтобы можно было легко видеть чьи лекции там есть и за какие даты. А для этого понадобятся ссылки на такие запросы.

Пока ссылок на такие запросы по меткам на сайте нет (хотя они работают), но будут.

Как оно устроено

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

Для справки (в том числе для себя) приведу ключевой запрос:

  • есть таблица news к ключом id — посты
  • есть таблица tags с ключом tag_id — метки
  • есть таблица news_tags, связываюая news и tags отношением m:n.
  • Тогда запрос на новости, в которых есть метки 1406, 1 и 2, но нет меток 5, 6 и 137 (/tags/1406+2-5-6-137):
    SELECT
        news.*
    FROM
        news_tags nt
        LEFT JOIN news ON nt.news_id=news.id
    WHERE
        nt.tag_id IN (1406,2)
        AND nt.news_id NOT IN (
            SELECT
                nt2.news_id
            FROM
                news_tags nt2
            WHERE
                nt2.tag_id IN (5,6,137)
        )
        AND [прочие условия]
    GROUP BY nt.news_id
    HAVING COUNT(nt.news_id)=2 -- количество новостей “в плюсах” --
    ORDER BY ...
    LIMIT ...
    Для особых случаев (например, когда нет “минусов”) упрощаем SQL, разумеется.

Link | Leave a comment | Share

Сноски в книгах на сайте

Apr. 2nd, 2011 | 10:56 pm

Добавил специальный тег {{footnote}} для сносок в книгах.

Теперь вместо ручной организации сносок можно писать что-то вроде:

Он давал наглядую иллюстрацию: шишья{{footnote|Шишья (санскр.) — ученик}} подобен цветку лотоса.
И это чудо в фигурных скобках породит нормальную сноску, с подсказкой и возвратом к основному тексту:
Он давал наглядую иллюстрацию: шишья1 подобен цветку лотоса.

1 Шишья (санскр.) — ученик

Ещё из мелких исправлений за последение дни:

  • Убрал в редакторе новостей поле «очень кратко». Всё равно оно почти всегда было копией поля «кратко» и создавало больше проблем чем решало.
  • Убрал странное торможение SQL-запросов: по непонятной для меня причине некоторые запросы несколько дней назад вместо привычных 0.007 секунд начали выполняться 9—18 секунд. Анализ показал, что условия в выборке со сложными JOIN-ами почему-то стали приводить к полному скану большой таблицы:
    SELECT
        t1.id1, t1.name, COUNT(c1.id2) AS count
    FROM
        t1
        LEFT JOIN c1 ON t1.id1 = c1.id1
        LEFT JOIN t2 ON c1.id2 = t2.id2
    WHERE
        t1.id1 IN (SELECT ... FROM ... WHERE ...)
        AND t2.field1 = 1
        AND t2.field2 = 0
    GROUP BY c1.id1
    ORDER BY name
    
    хотя несколько дней назад всё летало. FORCE INDEX не помог, пришлось перенести некоторые условия из WHERE в JOIN и всё вернулось в норму:
    SELECT
        t1.id1, t1.name, COUNT(c1.id2) AS count
    FROM
        t1
        LEFT JOIN c1 ON t1.id1 = c1.id1
        LEFT JOIN t2
            ON c1.id2 = t2.id2
            AND t2.field1 = 1
            AND t2.field2 = 0
    WHERE
        t1.id1 IN (SELECT ... FROM ... WHERE ...)
    GROUP BY c1.id1
    ORDER BY name
    
  • наладил иконки для пред./след. новости: когда иконка не указана, ссылки на эту новость иногда показывали пустую картинку вместо дефолтной.
  • мелкие улучшения в блоке «делиться»

Link | Leave a comment | Share

Комментарии на harekrishna.ru и прочие изменения

Mar. 29th, 2011 | 02:28 pm

Добавил к новостям на сайте кнопку «мне нравится» из фейсбука и комментарии. sir_reistlin  давно об этом просил, но как-то руки не доходили. Сначала хотел поставить disqus, но потом обнаружил, что недавно фейсбук сделал свои комментарии, так что для пробы поставил их. Пока что полёт нормальный: лайки и комментарии идут, тролли до нас пока не добрались.

Появился вопрос о формулировке. Новости бывают и печальные, и предлагать нажать «Мне нравится» на таких новостях это кощунство. Думаю над двумя вариантами: или везде переименовать в «Рекомендую» (на новостных сайтах встречается) или добавить галочку «печальная новость» в движок, чтобы переименовывать только на таких новостях.

Ещё добавил в блок «поделиться» кнопку google buzz. Опять же: sir_reistlin  давно просил об этом, но я думал, что яндексовская кнопка этого не поддерживает, а свою было лень делать. Сегодня обнаружил в документации на полную версию этой кнопки, что есть такая поддержка, хотя об этом и не сказано в документации к простой кнопке.

Ещё из малозаметных изменений за последние пару недель:

  • восстановил фотографии в нескольких десятках старых новостей за 2003–2004 гг.
  • улучшил выделение кавычек для ссылок в списке новостей (можно "ссылка", можно «ссылка», можно «<strong>ссылка</strong>»).
  • тултипы со временем новости: теперь на главной странице можно увидеть во сколько появилась каждая новость.
  • исправил баг, где выдавались неправильные номера страниц в одностраничной новости
  • увеличил поле «очень кратко» в новостях с 255 до 499 символов (изредка натыкался на это ограничение). Это временное решение, пока не удалю это поле, но до этого ещё много рефакторинга.
  • форматирование стихов поправил (источник иногда ошибочно помечался жирным)
  • исправил подсветку постов: теперь они выделяются зелёным и на главной странице.
  • RSS почистил:
    • добавил <guid>: теперь даже при изменении URL-а новости она не дублируется в ридерах.
    • добавил имена в контакты в служебных заголовках
    • правильный ескейп во всех полях (к стыду моему, был неправильный)
    • вырезаем все теги из <title> (а то встречался <strong> всякий)
    • убрал "www" из ссылок (чтобы лишних редиректов не было)
    • добавил atom:link rel="self" на себя самого
    • в итоге добился 100% валидации на feedvalidator.org (в том числе нет предупреждений или рекомендаций)

И из внешне незаметных, но важных внутренних изменений:

  • Добавил проверку (почти) всех .php файлов через PHP_CodeSniffer.
    Пока что у многих файлов в начале стоит заглушка <?php // @codingStandardsIgnoreFile ?>, но при рефакторинге внимательно подчищаю код и убираю заглушки.
  • Исправил баги в Makefile: теперь php lint работает корректно, останавливает тестирование на первой обнаруженной ошибке (как и требуется) и не выдаёт лишних сообщений.
  • Сделал устойчивое обнаружение фатальных ошибок (теперь в таких случаях не “500” и не оборванный тест без диагностики, а нормальное сообщение).
  • Начал писать сравнение документов (DOM-деревьев).
    Это пригодится в будущем для показа истории изменений каждой новости в движке.
  • Рефакторинг. Если верить hg diff --stat, то с написания прошлого поста:
    93 files changed, 1742 insertions(+), 1271 deletions(-)

P.S. Сколь ужасно плох rich text редактор постов в livejournal! И данные теряет (только за время написания этого поста раз 15 терял, пока пытался обойти его баги), и в режим HTML иногда (непредсказуемо) не переключается, и кнопки не нажимаются, и вставка толком не работает... Я бы поставил тройку с минусом, позор программистам livejournal. И всё равно этот пост пришлось писать в HTML-коде.

Link | Leave a comment | Share

Вайшнавский календарь на 2011–2012 гг.

Mar. 22nd, 2011 | 07:21 pm

Выпустил русскую версию Вайшнавского календаря на 2011–2012 гг. несколько дней назад. Как обычно, сами даты (кроме экадаши) взяты из англоязычного оригинала на scsmath.com. И, как обычно, недооценил трудоёмкость этой работы: думал управиться за пару часов, а в итоге сел с вечера и всю ночь над ним работал, почти до 9 утра. Даты постов на экадаши традиционно взяты для Москвы (в оригинале были Навадвипские).

Видимые изменения

  • Появился вайшнавский календарь на 2011 год — до 13 марта 2012 г.
  • Появилась подсветка важных дней и дней постов.
  • Появились ссылки на предыдущий-следующий год наверху и внизу в полных календарях.

Слабозаметные изменения

  • Как обычно, автоматически появилась .ics-версия календаря для айфонов и прочих игрушек.
  • Обновил поддержку летнего и зимнего времени (это нужно для правильного вывода времени парана — прерывания поста после экадаши), ведь в этом году на зимнее время страна переходить уже не будет — остаёмся в вечном летнем времени.
  • Подсветку дат постов и больших праздников пришлось сделать хитро. Поскольку обычный background-color не позволяет выйти за пределы элемента, а наивный padding меняет отступы, чего хочется избежать, то сделал так:
    <span class="fasting-date"><span></span><b>30 марта</b> (ср.)</span>
    а вложенный пустой <span> через CSS делаю блоком нужного размера, который через z-index отправляю на задний план.
  • Для Ишарупы, которая делает печатную версию календаря, сделал печатный вариант, где форматирование почище: названия месяцев не повторяются, болда нет и т.п.
  • Ну и, конечно, нашёл и исправил несколько опечаток в календаре (кажется, это бесконечный процесс).

Как устроен календарь на сайте

Когда-то, лет 8 назад, календарь хранился в простом HTML-файле, а блок «ближайшие праздники» на главной странице обновляли вручную.

Немного позже появилась автоматизация: календарь хранится в массивах в .php файлах и скрипты находят и печатают только нужные даты, как на главной, так и в годовом календаре. Как ни странно, столь наивный подход работает хорошо, и пока что необходимости в переносе данных в БД или иных "серьёзных решениях" не возникло. PHP-кэши, разумеется, сильно помогают.

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

Как обновляется календарь

Кратко опишу процесс подготовки календаря на следующий год:

  1. Делаем заготовку календаря, сдвигая даты прошлого года.
    Поскольку календарь из года в год меняется мало, то оптимально каждый год брать за основу прошлогодний календарь, только сдвигая даты в нём. Поскольку календарь рассчитан по лунным циклам, а даты пишем как в обычном солнечном, то сдвиг с прошлого года это не 365 или 366 дней, а меняется из года в год. Более того, этот сдвиг не фиксирован в течение года. Для этого в этом году сделал программу интерактивного сдвига, в которой можно "на ходу" сдвигать даты, сверяясь с текущим календарём.
  2. Исправляем праздники, разошедшиеся по разным днаям
    Поскольку на один солнечный день может придтись не один, а два титхи (лунных дня), то праздники, которые в прошлом году были в один день, в этом году могут оказаться в соседние дни, и наоборот. Это требует ручной правки.
  3. Наконец, вносим реальные изменения в календарь
    Из года в год календарь немного меняется: какие-то даты добавляются, а, бывает, и удаляются из календаря. Первая часть календаря (2011_rus.php) готова.
  4. Готовим календарь для экадаши

    По указанию Шрилы Гурудева мы отмечаем все праздники по датам Навадвипа, а экадаши отмечаем по местному календарю. Это чтобы не получалось, например, неудобной ситуации когда местный храм отмечает явление Махапрабху, а на самом деле в Навадвипе он ещё не явился. Даты экадаши я рассчитываю старым добрым VCal версии 4.01 — старая ИСККОН-овская программа. Кажется, с тех пор появилась новая версия, но я не искал. Надеюсь, что даты и время экадаши новые версии VCal считают так же, так что обновляться необязательно (впрочем, надо бы это проверить).
    VCal выдаёт текстовый файл с календарём. Затем за дело берётся ruby-скрипт vcal2harekrishna.rb, который выделяет экадаши и махадвадаши из вайшнавского календаря, выделяет время выхода из поста для них (корректируя за зимнее-летнее время, поскольку VCal этого не делает) и выдаёт .php файл, пригодный для включения в календарь на сайте: 2011_rus_ekadasi_moscow.php.

  5. Включаем загрузку данных для нового года в главном скрипте календаря.
    Всё остальное происходит автоматически: календарь появляется в списке календарей, появляются даты из него на главной странице, появляются его html, .ics и печатная версии.
  6. Остаётся исправить ссылку «Смотрите также полный календарь на год» на главной странице и всё готово!

Чтобы скрипты в будущем не пропали, в этом году внёс их в основной репозиторий кода сайта.

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

Link | Leave a comment | Share

PHPUnit: как бороться с ошибками компиляции файлов тестов

Mar. 21st, 2011 | 08:20 pm

Есть у PHPunit неприятная особенность: если в одном из .php файлов с тестами есть ошибка, из-за которой файл даже не компилируется, то PHPUnit молча вылетает на этом тесте безо всяких сообщений. Даже запуск режиме --verbose не помогает.

Я так решил эту проблему: прогоняю php -l (php lint) по всем файлам тестов прежде чем запускать собственно phpunit. Благо, тесты запускаю из Makefile, так что одна строка с использованием find + xargs + sed успешно решает эту проблему:
tests: lint-tests
        phpunit Tests/

lint-tests:
        find Tests -type f -name "*.php" -print0 | xargs -0 -n1 php -l | sed -e "/^No syntax errors detected/d"
Обнаружил логичную и приятную особенность xargs, на которую раньше не обращал внимания: он возвращает ошибку сам, если есть сбой хоть одного из дочерних процессов, так что make вовремя останавливается если есть опечатки.

Проблема решена!
Tags:

Link | Leave a comment | Share

Предварительный просмотр и сверка текстов

Mar. 6th, 2011 | 09:08 pm

Доделал сегодня то, что ваял последние 4 дня: предварительный просмотр текста во второй колонке. В редакторе справа от поля «Текст» появилась соответствующая кнопка.

Главное ради чего я это придумал — возможность сверять переводы и правки текстов не выходя из редактора сайта. Несколько дней назад dimanski108 попросил посмотреть перевод одной статьи Бхактивинода Тхакура. Я решил, что по этому поводу следует реализовать свою давнюю мечту: дублирование текста во второй колонке. Поэтому сперва доделал эту фичу, а уже потом взялся за правку. Правка, кстати, потребовалась минимальная — этот перевод Вриндавана Чандры очень хорош.
Подробности...Collapse )

Link | Leave a comment | Share

Перенос длинных слов

Mar. 3rd, 2011 | 05:31 am

Заметил сегодня, что длинные слова очень некрасиво выглядят в ссылках на предыдущую-следующую новости, потому что не влезают в строку. Например, в этой новости слово «справедливости» в ссылке на следующую новость не влезает в одну строку и поэтому уползает под картинку. В результате остаётся много пустого места там, где оно не нужно.

Чтобы решить эту проблему сделал переносы слов в этом блоке. Для экономии времени использовал уже готовый модуль переносов Hyph от некоего Снусмумрика. Это чистый JavaScript, т.е. получается минимум дополнительной нагрузки на сервер. Из минусов — не всегда правильно переносит и нельзя попросить не делать переносы в коротких словах. Из плюсов — он работает и самому ничего придумывать не надо.

Попробовал было делать такие переносы и в больших текстах на сайте, но получается некрасиво:
  • много неправильных переносов, особенно в словах санскритского происхождения: Kris-hna, Mahap-rabhu.
  • переносы весьма агрессивны, т.е. слово переносится при первой возможности, даже если текст центрирован и следующая строка остаётся короткой.
  • некоторые строки разъезжаются в ширину на три экрана. Этот глюк даже на сайте автора встречается.

Всё-таки переносы в web хороши только для совсем узких колонок. В общем, ограничился переносами только там, где без них совсем худо.

Link | Leave a comment | Share