Web

Q: nginx: rate limit, postgresql?

Вот так вот выглядит статистика веб-антиспама за последние месяцы на libraw.org:

На rawdigger.com еще показательнее:

И это только голова. В том смысле, что это - заблокированное Mollom, а там еще перед ним тоже есть слои антиспама.

Друпальское: img_assist to img src

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

В прошлый раз я выяснил, что за пять минут это не делается, за прошедшие ровно 11 месяцев все стало лучше:

  • Процедура апгрейда требует всего трех небольших правок. Если бы у меня был MySQL - и без них бы обошлось, но вот Postgres их все еще требует. Изобретать ничего не надо, все находится в друпальских форумах.

    Подробнее напишу, когда какой-нибудь из сайтов поставлю в бой.

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

Что делает: меняет теги img_assist на <img src=..., расставляя размеры и выравнивание. popup меняет на банальный <a href=... target=_new

Применять скрипт до апгрейда на D7. Более того, его можно применять и просто на D6, ничего плохого не будет.

Запускать: ./i2i.pl databasename

Скрипт рассчитан на постгрес, но с MySQL будет работать после минимальных правок.

Друпальское: аккуратно разложенные грабли в pager

Для памяти, чтобы не забыть.

Со всей дури налетел на эту вот особенность: Pager missing if views is installed.

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

Только вот в одном случае строится список комментариев с pager, а в другом - нет.

Когда в очередной раз обгуглился и нашел про Views, то конечно стало понятнее:

  • Блок Views с pager у меня таки был.
  • А в тех дизайнах, где pager под комментариями появлялся - просто не выводился этот блок из Views.
Штатное лечение - каждому pager во views - задать уникальный (по сайту) Pager ID, благо средства для этого есть. Риторический вопрос только один, а почему этот Pager ID сразу не формируется уникальным, ну там из ID view и номера блока в нем.....

На закуску хочу заметить, что вся эта конструкция, когда зовутся функции по именам (ну там themename_preprocess_html), а если такой нету, ну значит не судьба, - это очень гибко, но, блин, отлаживать это - это нечто.

Про Drupal7: ненависти (вместо любви) псто !

Только я собрался написать, что впечатления про Drupal7 более-менее положительные, все такое современное, с оверлеями и прочими понтами... как вдруг, внезапно, вылезла проблема:

Если пойти на сайт под D7 по битому URL somesite.domain/node/some-garbage

То вылезает PDO Exception, дескать к числовому полю ходят с символьным ID. Ну, как минимум под PostgreSQL вылезает, возможно MySQL к этому более толерантен (и мусор превращает, скажем, в 0, что не менее прекрасно).

В Drupal6 это место сделано куда разумнее, возвращается обычная страница '404' (нема такой страницы).

Понятно, можно подпереть на фронтенде, фильтровать после /node/ (/comment/, /user/) весь нечисловой мусор, но слишком много исключений (/node/add, небось и всякие /node/что-то-еще тоже бывают).

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

Гуглую и нахожу прекрасное: PDOException:Invalid text representation when attempting to load an entity with a string ID.

Ровно эта ошибка, ну думаю внесли недавно, сейчас возьму оттуда патч, а в следующем релизе поправят.

Ни хрена! Проблема открыта 21 декабря 2010, сопли жуют уже больше года, и все ради патча на 7 строк (который тривиален и работает, я его оттуда взял, последний по списку).

Я догадываюсь, что проблема в процедуре: активная ветка жалоб приписана к Drupal8, который какбэ девелопится. А репорты про 7.x (один нашел, тоже больше года ему) - помечен как duplicate от D8, вычеркнут и в боевой версии D7 его какбэ и нету. Запихали проблему под ковер.

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

А в остальном - семерка пока нравится, если с нуля. Апгрейдить в нее с осени ничего не пробовал, даже в тестах. Но теперь я ее опасаюсь.

Любви к Drupal7 псто!

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

Докладываю

1. Кнопки 'Split summary at cursor'/галки 'Show summary at full view' - нету. Но жить можно с визуальным редактором: TinyMCE получает кнопку, аналогичную Split, галка 'Show summary' при этом какбэ по умолчанию, но если что-то написать в Summary, то в списках постов будет именно оно.

Логика чуть другая, но жить можно.

Со вставлением картинок тоже чуть иначе, но тоже жить можно:

Ненависти к Drupal7 псто!

Поигрался с тестовым сайтом, поапгрейженным из Drupal6 в Drupal7, испытал мучительное недоумение.

Снес нахрен, поставил D7 с нуля, недоумение не стало менее мучительным.

У меня, по большому счету, требований очень мало:

  • Мне нужно писать тексты, причем я готов их прямо в HTML фигачить. От визивигов яваскриптовых - тошнит, если честно.
  • Мне нужно управлять текстом аннотации, которая на глагне показывается. И средств D6 мне более чем хватает (а там можно, если не доверяешь автомату, разделить текст на аннотацию и хвост, аннотации поставить галку "входит в полный текст"), т.е. я могу сколько хочу абзацев сделать аннотацией, а могу ее отдельно написать).
  • Мне нужно просто вставлять картинки:
    • простой браузер того, что уже залито на сервер.
    • простая кнопка, позволяющая поаплоадить (и задать alt/title, чем я не пользуюсь, впрочем)
    • вставка с указанием размера (оригинал, какие-то стандартные, возможность задать свои), выравнивания и действия при клике на картинку (ничего, открыть полный размер в новом/том же окне, перейти по ссылке).
  • Ну теги-категории, понятно и прочие мелкие галки (кросспост в ЖЖ, режим комментариев, задание URL)
  • Все, больше ничего не надо. Если захочу клип с Youtube - руками вставлю, надо редко.

Всю эту функциональность умеет Drupal6 из коробки + image/image assist + чуть-чуть других модулей.

А вот D7 привычную картину D6 нарушает в куче мест:

Drupal6 -> Drupal7

В очередной раз подошел к снаряду по имени Drupal7. Имею сказать:

1. Если у вас PostgreSQL, то даже Drupal 7.9 (текущий) не сможет поапгрейдиться гладко. Оно пытается сконвертировать поля типа text в тип bytea, а в PostgreSQL 9.1 (другие не пробовал) автоматического преобразования этих типов нет.

Лечение (применяется к базе PostgreSQL до апгрейда):

CREATE OR REPLACE FUNCTION text2bytea(text) RETURNS bytea AS
$BODY$
begin
 return convert_to($1,'UTF-8');
end;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
CREATE CAST (text as bytea) with function text2bytea(text) as implicit;
Может я тут что и перепутал и as implicit не нужно, но работает и "базовый" сайт (core modules) переносит.

2. А вот в том, что касается contributed modules - счастья у меня нет:

Про перевод часов, таймзону, PHP и Drupal

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

PHP:

  1. У PHP база данных таймзон вшита в пузо и, конечно, не обновляется регулярно.
  2. Но есть pecl-timezonedb, который ее оверрайдит, со свежей базой (последняя имеет номер версии 2011.13), с этим расширением с таймзонами все станет отлично и любимая всеми Europe/Moscow будет работать как полагается по новым правилам.
  3. Но если вы живете под FreeBSD, то там /usr/ports/misc/pecl-timezonedb не обновлялся очень давно, посему:
    • Меняем там в Makefile 2010.9 на 2011.13
    • удаляем distinfo
    • make && make install
  4. Добавляем timezonedb.so в список extensions.ini (на FreeBSD это сделает make install)
  5. Перестартовываем PHP-fastcgi или Apache или что у вас там работает процесс-сервером для PHP
  6. Ура, можно накатить первый стакан.

Drupal 6:

  1. Сам по себе сразу начинает жить правильно (ну, насколько мне показалось). Т.е. таймзона меняется после апдейта PHP-timezonedb с +0300 на +0400 сама.
  2. Но! В Administer-Date-and-time есть настройка про User Configurable time-zone. Если она включена, то пользователю будут показываться даты-времена в его таймзоне. И весь созданный им контент будет иметь время создания рассчитанное из юзерской таймзоны.
  3. Но. Юзерская таймзона специфицирована в секундах смещения от UTC.
  4. Выходов два: или для всех российских пользователей взять и поправить скриптом (по хорошему, с учетом даты регистрации), или просто отменить настройку пользовательских таймзон. Я пошел по второму пути.

О платформах и технологиях

Вот берем два Друпальских модуля внешней авторизации:

  • Facebook Connect - позволяет одним кликом создать аккаунт на друпальском сайте, все мгновенно.
  • OpenID - аккаунт создать позволяет, но не верифицированный, уйдет E-mail, на полученный линк надо будет кликнуть (да и то, эта функциональность не так давно появилась, раньше можно было только существующий аккаунт привязать к OpenID-URL).
И сначала я на поведение OpenID ругался (про себя, да и вслух), а потом осознал сермягу:
  • В случае Facebook (ЖЖ, Твиттера, Вконтакте, MailRU....) я доверяю (или не доверяю) конкретному сервису (платформе). А они, в свою очередь, пытаются (своими немаленькими ресурсами) отличить людей от роботов и все такое. Список доверенных - невелик, а если вдруг чего, то и отозвать доверие недолго.
  • В случае протокола (технологии) - доверие делегируется неизвестно кому. Какому-то Васе или Пете, который асилел OpenID-сервер поднять. Но я точно знаю, что средний спамер (что по каментам, что по почте) технологически гораздо продвинутее, чем просто средний Вася. Более того, спамеры на порядки активнее "просто пользователей".
Получается, доверять технологии - нельзя. Платформе, за которой стоят конкретные люди и силы, заинтересованные в хорошей работе платформы - можно. Платформа может быть распределенной, конечно, но не изолированными островками неизвестного количества.

Мораль: OpenID труп.

День друпала

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

В последнее время меня достал спам в каментах. Мало того, что пробивают капчу и статистический антиспам, по каким-то причинам даже то, что как спам детектируется - вызывало приход почтового уведомления. Воспроизвести не удалось (все что я писал "вроде спама" - просто ложилось в спам же, без уведомления), пришлось двигать мебель и менять девочек.

Друпалеру на заметку

Если у вас по каким-то причинам есть запись в таблице node, но нет ни одной записи с таким nid в node_revisions, то у вас ВНЕЗАПНО начнут портиться права доступа. Причем rebuild permissions будут помогать ненадолго, до попытки создания очередной node.

Детектируется проблема элементарно:

 select nid from node n where not exists (select nid from node_revisions r where r.nid=n.nid);
Лечится - таким же delete.

Но я сегодня чуть не фалломорфировал, разбираясь.

Почему создание записи с revision не обернуто в транзакцию - мне удивительно, но подозреваю что это привет от MySQL.

Цирк-с-конями.рф

Цирк с конями Приколы в национальном домене продолжаются, я уже смеяться устал.

Комедия в бесконечном числе действий:

  1. Регламент регистрации в .РФ предусматривает отказ регистрации в случае, если нарушается нравственность и мораль. Список нарушений морали и нравственности установлен КЦ и широко обсуждался (гуглить по словам "ебля с перископом"), в том числе и в этом блоге.
  2. Прошел уже месяц с приключениями, блокировками и прочим боданием Руцентра и КЦ, аморальный список действует (в числе прочего, домен старые-бляди.рф довольно долго торчал в whois с личным E-mail Лесникова в контактных данных, недавно поменяли).
  3. ВНЕЗАПНО Руцентр вводит свой стоп-лист
  4. И начинает снимать с регистрации уже зарегистрированные домены.
  5. Которые ТУТ ЖЕ перехватывают другие регистраторы, а вы как думали.
Понятно, что у многих/большинства Руцентровских доменов Администратор - сам Руцентр, он может направить (сам себе?) письменное заявление о снятии с регистрации и снять. А владелец домена - при этом может пососать упса с витамином "С".

Попкорн кончается, надо бежать в магазин за новой дозой....

Про Drupal 7

По случаю выходных, помацал Drupal 7 (в связке с PostgreSQL 9, гулять так гулять). Внутрь особо не заглядывал, просто покрутил в руках на тестовом сервере.

Имею сказать:

  • Штука - работает. Ну то есть я пробовал свежую инсталляцию, а не апгрейд старой, с апгрейдом лично у меня будут проблемы.
  • Модулей, прямо скажем, не хватает. Я смотрел список используемых у меня на разных сайтах, дойдя до буквы I обнаружил уже две проблемы и остановился. Проблемы такие:
    • Нету inline tags, а я этот модуль использую для публикации через BlogAPI (собственно, BlogAPI тоже нет, но вроде есть какая-то замена). Как-то можно обойтись, что-то похакать, может быть в замене BlogAPI категории работают.
    • Нету GeSHi Filter (syntax highlighter для кусочков кода) и это уже совсем большая потеря. Замены есть и не одна, но все с другим синтаксисом, вместо <code> что-то еще, а это готовые тексты-каменты править.
В-общем, пусть поживет еще несколько месяцев без меня....

Про Amazon EC2

Развлекаюсь тут с Amazon EC2 и вот чего не могу понять

Хочется, на самом деле, SUSE 11.2, потому что весь девелопмент проекта на нем и бинарники, соответственно, переносимы без лишних ужимок (и почти гарантированно думать про это не надо)

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

С Амазоновским AMI (Amazon Linux) - никаких проблем, но см. выше.

Риторический вопрос, это опять моральные индусы меня окружают или же просто два раза из двух не повезло?

Update: сошлись с ними на 12-й федоре. И проект собирается (gcc 4.4 из коробки и все такое) и имеющийся образ с EBS - загрузился.

Cheap SSL certificates

Вбиваешь в гугель то, что выше написано, и получаешь, в первом приближении, такое вот:
  • GoDaddy за $9.99-$13 (у разных реселлеров).
  • Rapid SSL за $14 (если на 5 лет).
Дальше не стал копаться.

Скажите, а в чем тут обман? У меня задача - заменить самогенеренные, чтобы броузеры и SVN-клиенты не ругались на левый сертификат, никакого е-коммерса. Заплатить за это $10-15 в год с сайта (SVN-репозитория) мне совершенно не жалко, но может быть вышезаявленная цель не будет достигнута? Четвертак - уже жалко :).

У GoDaddy - chained сертификаты, но мне не кажется, что в 2010-м году это должно создавать какие-то проблемы. У RapidSSL все обещано "совсем честным"....

Прощание с полимерами?

Просрали все полимеры!

Когда я работал в одном маленьком сумасш интернет-холдинге начальником Top100, меня очень интересовал вопрос: а что будет, если ужасный плоский рубрикатор Топ100 (из 50+ рубрик первого уровня) заменить на правильный иерархический?

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

Прошло 8.5 лет и новое руководство Top100 таки решилось.

Вопрос про юзабилити поиска

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

Если вы читате через ЖЖ, то таки придется открыть канонический вид.

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

Критика всплывающего окна и прочие наезды на javascript не принимаются, со временем я переделаю это нормальным модулем со всякими наворотами, заодно научусь делать модули под Друпал, но пока оверлей на jQuery оказался сильно быстрее, чем разбираться еще и в этом.

ljcomments2drupal 0.02

Первая (0.01-я) версия ljcomments2drupal оказалась, как любой скрипт на скорую руку, с ошибками.

Версия 0.02 исправляет известные на сегодня проблемы:

  • Если комментарий один (добавился один свежий), то неправильно импортировалось имя комментатора. Это фишка XML::Simple (разное поведение с одним значением и с несколькими), про которую я постоянно забываю.
  • Неправильно устанавливалась homepage автора комментария (ссылка на его ЖЖ).
  • Добавлен скрипт fixauthors.pl, который правит накопленные ошибки прямо в БД сайта.

Качаем новую версию тут: ljcomments2drupal-0.02.tar.gz

Опять про wordstat

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

Но сам пример с икея/икеа настолько хорош, что заслуживает еще одной заметки.

Pages

Subscribe to Web