Movable Type

Holy war: Movable Type vs Drupal

В начале января я заменил на блоге Movable Type на Drupal. Прошло три месяца, можно уверенно говорить, что переезд удался.

Но вот на что хочется обратить особое внимание: посещаемость выросла практически вдвое (на графике выше - понедельные визиты по Google Analytics). И произошел этот рост - в течение пары недель, после чего посещаемость стабилизировалась.

Дело не в моей писучести - как писал 10-15 текстов в месяц, так и пишу. Более того, количество постоянных подписчиков (RSS и ЖЖ-френды) таким скачком не выросло, рост есть, ну процентов может на 15 за три месяца.

Половину роста дали поисковики, им (не знаю почему) Drupal оказался более люб. Вторая половина - просто не понимаю откуда (direct traffic, согласно Google Analytics). Чудеса. Но факт - вот он, на лице.

Миграция Movable Type -> Drupal. Синхронизация с ЖЖ, наведение марафета, финал

Руководство по прыжкам с парашютом, издание второе, исправленное

Теги/рубрики/категории

При миграции контента с тегами и категориями был предложен такой метод

  1. Делаем категории тегами (чтобы не заполнять значения).
  2. Импортируем.
  3. Меняем тип таксономии категории на "Multiple select/Mandatory".
  4. Правим пути к категориям.

Увы, но где-то на этом пути теряются категории у изрядной части записей и теги - у единиц, повторный импорт лечит только частично. Я подозреваю, что крышу рвет, если есть теги, совпадающие с категориями, но не уточнял.Теги портит LJ Sync, пришлось его еще шашкой....

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

Миграция MovableType -> Drupal. День 2: миграция контента и URL

Предуведомление

Описанная ниже методика предназначена для заливки пустого сайта на Drupal. Задача доливки контента на сайт, где уже что-то есть - не ставилась. Более того, на стадии импорта комментариев все старые комментарии точно будут стерты.

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

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

Импорт записей

Задача: вытащить записи (посты) из БД MovableType и запихать их в БД Drupal в виде объектов типа Story. Создание Drupal-объекта связано с заполнением нескольких таблиц (node, node_revisions и прочие node_*, url_aliases), пополнением таблицы тегов, другими словами эту работу не хочется делать вручную (SQL-запросами), а хочется перевесить на внутреннюю механику Drupal (ведь при создании записи оно как-то само все делается...).

План работ тривиален и прост:

  • Ставим модули Table Wizard и Migrate.
  • Добавляем нужные поля в структуру данных записи Story (не вручную, включением готовых модулей).
  • Запускаем скрипт, который перенесет нам данные постов в БД Drupal.
  • Импортируем образованную таблицу с постами в Table Wizard.
  • Делаем импорт через Migrate.
  • Полируем результат.
Первый пункт особых вопросов вызвать не должен, обычные модули. За собой потянут Views и Schema, их тоже надо выкачать и поставить, до кучи полезен и Views UI.

Миграция MovableType -> Drupal. День 1: постановка задачи

Предуведомление

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

Короче, не нравится - не читайте :)

Статус этих записок

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

Зачем переезжать

Моя причина очень простая: мне надоело поддерживать две платформы (Drupal и Movable Type). При этом, по комплексу свойств Друпал побеждает, а значит с MT пора прощаться. А новогодние каникулы - хороший повод позаниматься чем-то полезным.

Bye-Bye, Movable Type

No-MT.png Как нам пишут в комментариях, а потом мы и сами читаем:

Q: On http://www.movabletype.jp/documentation/mt5/db/mysql-from-sqlite.html I read: From the Movable Type 5, SQLite and PostgreSQL are no longer supported.
A: Yes, it's true. MT5 will deprecate core support for SQLite and PostgreSQL. But, these databases can still be used with MT if a plugin is written to add support; the Enterprise Pack defines the drivers necessary to use the Oracle database with MT.

Вот и выяснилось, чем придется заниматься на новогодних каникулах, писать тестировать LJ-кросспост для Друпала (оказалось, он уже есть, что же я торможу?)

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

Movable Type 4.23

Решил по случаю воскресенья поапргейдить блоговый движок. C Movable Type 4.21 на 4.23.

Обнаружил неприятность: в поиске (включая поиск по тегу) пролюбили локализацию дат. То бишь, независимо от настроек блога, название месяцев пишутся английские, а формат даты тоже тамошний (Месяц, число год).

noindex-патч для MovableType, 4-я попытка

По совету Николая Сиварева удалось избавиться от главного недостатка моего предыдущего noindex-патча для Movable Type: неудобства при открытии ссылки по правой кнопке.

Правда патч усложнился и теперь состоит из двух частей.

  1. На Movable Type нужно наложить вот этот вот патч: patch-nofollow-img-js2.gz.
    В результате все внешние ссылки получат вид <a href="#link" onClick="return 'http://link-target';">
  2. В темплейт, где-то в районе footer нужно добавить следующий Javascript-код:
    var links = document.getElementsByTagName('A');
    for(var i=0; i &lt; links.length; i++)
    {
       if(links[i].href.match(/\#link/) && typeof links[i].onclick == 'function'){
            links[i].href=links[i].onclick();        
        }
    }

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

По совету Николая Сиварева удалось избавиться от главного недостатка моего предыдущего noindex-патча для Movable Type: неудобства при открытии ссылки по правой кнопке.

Правда патч усложнился и теперь состоит из двух частей.

  1. На Movable Type нужно наложить вот этот вот патч: patch-nofollow-img-js2.gz.
    В результате все внешние ссылки получат вид <a href="#link" onClick="return 'http://link-target';">
  2. В темплейт, где-то в районе footer нужно добавить следующий Javascript-код:
    var links = document.getElementsByTagName('A');
    for(var i=0; i &lt; links.length; i++)
    {
       if(links[i].href.match(/\#link/) && typeof links[i].onclick == 'function'){
            links[i].href=links[i].onclick();        
        }
    }

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

Про спам в каментах

Ответ по заявкам телезрителей (пришло в личную почту) на вопрос про сапам в комменатриях.

На удивление, простые народные средства помогают не тратить на эту проблему больше нескольких минут в день (на 5 сайтах с открытыми комментариями и приличным pagerank).

Хочется думать, что помогает в первую очередь бессмысленность спама по каментам: noindex+nofollow везде, отчего нет смысла тратить много усилий. Но безумные роботы таких тонкостей не знают и их реально много.

Drupal, BlogAPI и теги

Задача: публиковать автоматические ленты новостей на сайтах. Новости берутся с веба, обрабатываются (распознается тематика, присваиваются теги), после чего появляются на сайте.

По идее, для этого предназначен Aggregator, но его интеграция с Taxonomy запланирована только в Drupal 7. Кроме того, pull мне очень не понравился, хочется push. Для push есть BlogAPI, там даже поддерживается установка категорий (тоже довольно диким способом, ибо информация о словарях недоступна, можно получить только список терминов), но вот установка тегов (т.е. терминов, которых в словаре может не быть) через стандартный BlogAPI невозможна. mt_tags - не поддерживаются и не обрабатываются.

Я уже почти поправил BlogAPI (всего то нужно задать один параметр конфигурации - в какой словарь класть теги, остальное все тривиально) и оно уже почти работало, но нашлось готовое решение.

Inline Tags делает все что нужно. Не стандартным путем (т.е. использовать готовое поле tags в blog-редакторе и передачу значений в mt_tags), но вполне приемлемым: список тегов пишется в [tags][/tags] и все работает (проверено).

nofollow-патч для MovableType, 3-я попытка

После высказанной критики, вчерашний патч пришлось усовершенствовать:

  • Картинка со ссылкой убирается в <noscript>, большинство посетителей ее не увидят.
  • Переход по ссылке делаем яваскриптом, через window.location=

Патч вот: patch-nofollow-img-js.gz

Понятно, что есть недостатки:

  • В статусной строке не отображается URL. Это тоже лечится яваскриптом, но уже лень т.к. просто присвоение windows.status= не работает в Firefox/Opera, нужно таймеры ставить.
  • Потерялось открытие ссылки в отдельном окне. Можно, наоборот, сделать через window.open, но тогда потеряется открытие в текущем. Счастья нет.

В этом блоге, впрочем, используется несколько другая версия патча, которая оставляет ссылки на мои сайты прямыми, а остальные открывает в новом окне. Не публикую т.к. не нашел разумного способа вытащить хотя бы URL текущего блога в том месте, где зовется nofollowfy();

MovableType: новый nofollow-патч, MT 4.21

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

Раз уж засунул туда нос, переделал свой патч для <noindex>. У старого была проблема в том, что сам текст ссылки не индексировался Яндексом (ибо ссылка была запихана в noindex целиком). Теперь ссылка устроена иначе - текст подчеркивается, а сама ссылка теперь в иконке (позаимствованной у Википедии). Пример можно посмотреть в любых комментариях, например тут.

Скачать патч можно тут:

  • patch-nofollow-img.gz. Возможно, вам захочется поправить URL картинки, но это уже сами.

Чтобы два раза не вставать, полный список остальных моих патчей к MT 4.x:

  • patch-monday-mt41.gz делает понедельник первым днем недели в стандартном календаре.
  • patch-rudate.gz - русские названия дат (переведен блок для итальянского языка, его и нужно ставить в настройках блога).
  • patch-dirify.gz - добавляет русские буквы в таблицы "дирификации".

Все патчи подходят к 4.21

Синхронизация комментариев ЖЖ-&gt;MovableType

У меня уже более полугода работает скрипт синхронизации комментариев из ЖЖ в MovableType. Мне тут даже попеняли, что не делюсь с народом...

За полгода он никаких значимых проблем не создал, работает, а значит можно и опубликовать и даже версию 1.0 присвоить:

ljcomments2mt-1.0.tar.gz

Копия Readme прилагается.

Еще про nofollow в MovableType 4

Как мне тут справедливо указали, настройка "приделывать rel=nofollow к комментариям и трекбекам" не влияет на содержимое тега CommentAuthorIdentity

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

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

Вот и пригодился ProNet-овский аккаунт. Я через него засабмитил тикет, посмотрим чем кончится.

Да, если вы используете мой патч про noindex, то ссылки в обсуждаемом теге будут обвернуты и noindex тоже

Update: из саппорта ответили "читайте документацию" (см. комментарии). И ведь они правы.

MovableType 4.1 и русский язык

Меня и бета-версии MovableType не особо пугают, поэтому сразу после выхода MT 4.1 я поапргейдился.

Если вы используете стандартный набор исходников, то все происходит абсолютно штатно: перенакатили исходники сверху, зашли в админку, согласились на апгрейд, через минуту все работает.

Если вы используете, например, мой метод русификации, то почти все старые патчи подходят, кроме одного (изменилось имя файла темплейта стандартного календаря.
Вот этот патч: patch-monday-mt41.gz - он делает понедельник первым днем недели в стандартном календаре.
Впрочем, если вы используете правильный (мой) Calendar Widget, то можно использовать старый вариант (программа patch либо не найдет одного из файлов, либо скажет что патч уже приложен, во втором случае на оба ее вопроса нужно ответить отрицательно).

Чтобы два раза не вставать, полный список остальных моих патчей к MT 4.x:

  • patch-nofollow.gz - добавляет к стандартному rel=nofollow на внешних ссылках (в комментариях и трэкбеках) еще и <noindex>, для поддержки российских реалий).
  • patch-rudate.gz - русские названия дат (переведен блок для итальянского языка, его и нужно ставить в настройках блога).
  • patch-dirify.gz - добавляет русские буквы в таблицы "дирификации".

Стандартное предупреждение: если вы не знаете что такое патч, то вам все это не нужно, пользуйтесь стандартными настройками MT.

Movable Type 4.1: Personal или Open Source ?

По случаю выхода сразу двух бесплатных вариантах, персональном и OpenSource, провел исследование разницы (путем запуска команды diff -r).

Результат ожидавшийся, значимых отличий нет, незначимые же таковы

  • В OpenSource версию включен текст GPL v2.
  • URL производителя разный, www.movabletype.org в OS-версии и www.sixapart.com/movabletype/ в бесплатной.
  • Три строчки копирайта отличаются во всех файлах

Список отличий от 4.01 существенный, буду пытаться ставить. Где бы еще стырить Professional Pack на посмотреть, обещают прекрасные темплейты....

Персональная блогосфера

Еще 31 августа я спрашивал как синхронизировать комментарии в основном блоге и в трансляциях. Основная идея в том, чтобы пересечь аудитории разных площадок.

Готового счастья не оказалось, как всегда, пришлось дожидаться свободной пары дней (4 месяца ждал) и своими руками сваять первый вариант:

Все комментарии из ЖЖ сейчас копируются в основной блог, где на них можно отвечать. Увы, ответы обратно в ЖЖ пока не транслируются. Трансляция не реалтаймовая (и вообще, пока из рук).

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

P.S. До августа я насильно загонял всех комментаторов из ЖЖ/Я.беты комментировать к себе. Это оказалось совсем дурной идеей, народ идет от привычной поляны очень неохотно, только если очень сильно зацепило.

Статистика для блоггеров - 2

Как показывает статистика, наибольший интерес за прошедшую неделю вызвала запись про статистику:
blogstat2-1.png
Поэтому позволю себе привести еще примеров данных, получаемых после обвешивания всего прозрачными пикселями 1x1.

Статистика для блоггеров

Сначала картинка. А вы так можете (не по цифрам, а по группировке данных)? Более подробные картинки будут ниже.
blogstats1.png
Я не знаю, есть ли нормальные средства статистики для блоггеров. Наверное, для простых случаев — есть. В ЖЖ можно поставить один из множества ЖЖ-счетчиков (уж не знаю, хороши ли они), на standalone-блог можно поставить обычный счетчик. Но это — для простого случая.

Опять про MovableType и dirify

Сегодня меня порадовали, дескать подписка на комментарии в твоем блоге не работает.

Действительно, на ряде записей ссылка "подписаться на комментарии к этой записи по RSS" была битая, вела на несуществующий фид.

Разбирательство показало, что:

  • Это касается только записей, где последняя буква (буквы) в title - непечатная (мягкий-твердый знак или знаки препинания). Эти символы дирифицируются в подчеркивание.
  • Сами такие записи имели URL вида date/bla_bla_.html (фиды: bla_bla_.xml).
  • Ссылки из списков записей (по месяцам, по рубрикам) были правильными.
  • А вот ссылки, сформированные через <$MTEntryBaseName$> вели на bla_bla.html.
Засучив рукава, я полез читать исходники MovableType и мне открылось страшное.

Экспорт темплейтов Movable Type, вариант 2

Предыдущий вариант скрипта экспортирует только те темптейты, которые уже описаны в конфиг-файле от Template Installer

В некоторых случаях это неудобно, хочется экспортировать все, включая widgets, системные темплейты и так далее. Поэтому родился новый вариант (скачать tmpl_export_full.zip).

Использование предполагается совместно с Template Installer:

./tmpl_export_full.pl OutDir [BlogID] [DSN]
 OutDir - обязательный параметр, что-то вроде 
   cgi-bin/mt/plugins/TemplateInstaller/template_sets/mycatalog
   (mycatalog будет создан если не существует)
 BlogID - ID блога (можно подсмотреть в параметрах mt.cgi при администрировании
    конкретного блога.
 DSN - Data Source в терминах DBI (dbi:Pg:movabletype - умолчание)
После исполнения скрипта, в каталоге OutDir появится набор темплейтов, который будет доступен плагину Template Installer.

Pages

Subscribe to Movable Type