Блог антисоциального программиста

Техзадание для движка блога


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

За эти три года я достаточно много работал с Drupal'ом и могу с чистой совестью подтвердить: из него можно построить сайт абсолютно любой сложности и с любым мыслимим и немыслимым функционалом. Засада лишь в том, что такая мощь мне на этом блоге не нужна, тем более, что за нее приходится платить тяжеловесностью сайта. Поэтому в качестве отправной точки я решил составить список требований которые я предьявляю к движку блога. Этому и будет посвящен пост.

Общее назначение движка

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

Пользовательская система

  • Движок должен поддерживать многопользовательскую модель.
  • Контроль доступа с помощью механизма ролей. Набор ролей фиксирован: админ, блоггер, комментатор.
  • Анонимный пользователь имеет роль комментатора.
  • Желательна поддержка авторизации как по логину-паролю, так и через сторонние сайты (Twitter, Google, Open ID). Оптимально, если будет возможность привязки к одной учетке нескольких методов авторизации.

Размещение постов и создание статических страниц

  • Движок должен позволять публиковать посты и статические страницы, с разметкой в HTML.
  • Пост включает в себя следующие параметры:
    • Заголовок поста
    • Тело поста
    • Дата публикации
    • Автор
    • Состояние: опубликован или черновик
    • Имя поста для URL
    • Поле для традиционного видеоролика в конце поста
    • Теги
  • Визуальный редактор CKEditor полным набором панелей инструментов.
  • Загрузка файлов и изображений через интерфейс редактирования поста. Желательна интеграция с CKEditor.
  • Создание миниатюр изображений. Желательно иметь возможность задавать размер миниатюр, если "умолчальный" размер не подходил, либо просто отключать миниатюры для конкретных изображений.
  • Планирование постов. Если у поста статус "опубликован", но дата публикации — в будущем, то он не будет отображен до наступления даты публикации.
  • Блоггеры должны видеть неопубликованные записи, все остальные - нет.
  • Черновики и отложенные записи должны визуально отличаться от обычных постов и друг от друга.
  • Включение/отключение комментирования для конкретных постов.
  • Желательно автосохранение черновиков как в WP.
  • Посты должны быть доступны через RSS.
  • Разделение на тизер и основной текст не требуется.
  • Поддержка размещения листингов кода с соответствующей подсветкой.

Комментирование

  •  Возможность комментировать посты и страницы, для которых это не было запрещено.
  • Желательна поддержка древовидных комментариев
  • Комментатор может указать свой ник, сайт и email, все, кроме ника - не обязательно.
  • Желательна возможность логиниться прямо при комментировании.
  • Комментатору доступен ограниченный набор html тегов.
  • Форма добавления комментария имеет визуальный редактор с набором инструменов, ограниченным набором разрешенных тегов.
  • В форму комментирования встроен антиспам, невидимый для пользователей со включенным JavaScript.
  • Возможна подписка на комментарии по email.
  • Для блоггеров каждого комментария должны быть дополнительные опции:
    • Редактировать
    • Удалить
    • Удалить ссылку на сайт комментатора (для упрощения выноса спамовых ссылок)
    • Удалить все ссылки из текста поста.
  • Желательно иметь возможность детектирования скрытых ссылок в комментариях.
  • Желательно экспортировать комментарии в RSS

Многоязычность

  • Интерфейс должен поддерживать как минимум два языка: английский и русский.
  • Весь контент может быть привязан к одному из языков. Если привязка не задана, он отображается для любого языка.
  • Комментарии наследуют языковую привязку от поста или страницы, к которой они относятся.

Интерфейс

  • Шаблон должен быть отделен от логики и быть максимально простым.
  • Должна быть поддержка управления верхним меню и меню в сайдбаре.
  • Сайдбар справа.
  • Следующие виджеты должны присутствовать в сайдбаре:
    • Редактируемое меню
    • Облако тегов
    • Блогролл
    • Архив по месяцам
    • Последние комментарии и посты
  • Комментарии располагаются под постом.
  • Форма добавления комментария - под всеми комментариями.
  • У каждого комментария есть кнопки "Ответить" и "цитировать выделенное".
  • На главной и на страницах отображения тегов должно присутствовать разбиение на страницы.
  • Поддержка вида для печати
  • Желательно редактирование постов и комментариев в упрощенном режиме с помощью ajax
  • Желательно удаление комментариев через ajax
  • Интерфейс должен приемлемо вести себя при отключенном JS или CSS

Требования к ядру

  • Кэширование всего, чего можно.
  • Желательна оптимизация CSS и JavaScript.
  • Желательно правильное и автоматическое расставление мета-тегов , и
  • Генерация xml-карты сайта, содержащей ссылки на:
    • Главную
    • Посты
    • Статические страницы
    • Страницы тегов

Итог

Требований, как оказалось, не так уж и мало, хотя далеко не все из них критичные. Поэтому в следующей заметке я уделю внимание техническим аспектам реализации движка.

Жизнь со вкусом


Kitty KitchenЭтот пост несколько выбивается из общей канвы блога, но я просто не могу промолчать. Что нужно настоящему программисту для счастливой жизни? Думаю, все согласятся, что в этот список точно входят интересная работа, комфорт дома и на рабочем месте и, конечно же, вкусная еда, приготовленная любимой девушкой. Вот о последнем и пойдет речь.

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

Извиняюсь перед теми, кто читает и думает «Ну хватит уже душу травить!», и перехожу к содержательной части. С этого момента все те вкусные рецепты, о которых я только что говорил, иллюстрируются и публикуются заботливой Олиной рукой лапой на ее кулинарном блоге. Так что все голодные программисты России могут вооружаться посудой и ссылкой на блог и приступать к изготовлению вкусной и полезной еды для себя любимых. Или, если вам повезло так же, как и мне, вооружать своих девушек. А если вы не будете забывать им помогать (с мытьем посуды, например), то у вас все шансы вкусно кушать не только по большим праздникам :-)

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

π-рог

w_a58301a4.jpg

Песочное печенье «Пески Времени»

w_05790914.jpg w_90344263.jpg

Бисквитный тортик

w_b0163c67.jpg

Мини-тортики по-кошачьи

А это вообще эксклюзив, рецепт пока не опубликован ;-)

w_9cb4c53e.jpg w_c292f04f.jpg

 И просто немного капучино.

w_485ebc31.jpg

Длинная задержка перед запросом пароля в SSH


Alek$ пт, 29/04/2021 - 12:10

Микро-заметка для себя и для тех, кто сталкнется с аналогичной проблемой.

Симптоматика

При попытке подключиться к удаленному хосту по ssh между установлением соединения и запросом пароля возникает длинная пауза (секунд 15-30). Она может появляться и пропадать в зависимости от того, из какой сети вы подключаетесь, однако никак не корреллирует со скоростью доступа.

Решение

В файле /etc/ssh/sshd_config установить следующие параметры:

GSSAPIAuthentication no
UseDNS no

После этого неприятная пауза исчезнет.

Собираем bash, запускающийся где угодно.


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

И так, наша цель собрать минималистичный bash свежей версии, без зависимостей и не требующий установки, чтобы потом запускать его с флешки или, как в моем случае, для выполнения скриптов для bash 4 в условиях CentOS 5.5, поставляющегося с ископаемым bash 3.2.

Кстати, только сегодня узнал, что на той неделе вышел CentOS 5.6, с более актуальными версиями софта, но в моем случае это ничего не меняет.

Для пущего осложнения жизни собирать будем 32-битный bash (чтобы запускался и на 32-х и на 64-х битах) в 64-битной Ubuntu.

Далее, пошаговые инструкции:

  1. $ sudo apt-get install build-essential gcc-multilib
    Это мы устанавливаем инструменты для сборки + библиотеки для кросс-компиляции под x86 (помним, что Ubuntu у нас x86_64 и компилятор в ней по дефолту тоже 64-битный).
  2. $ wget http://ftp.gnu.org/gnu/bash/bash-4.2.tar.gz && tar -xzf bash-4.2.tar.gz && cd cd bash-4.2/
    Качаем и распаковываем исходники bash. Я привел ссылку на актуальную на момент написания этого поста версию, однако возможно, вам в будущем захочется bash 4.3 или даже 5.0 ;-)
  3. $ export CC="gcc -m32"
    $ export CFLAGS="-m32"

    Это и есть главная хитрость, необходимая для сборки 32-битного bash. То ли я не до конца разобрался, то ли у них Makefile корявый, но каждой из этих опций по отдельности недостаточно для сборки не под текущую архитектуру. Равно как и не работают параметры --host и --target у скрипта ./configure.
  4. $ ./configure  --enable-static-link --without-bash-malloc
    Конфигурируем сборку. Параметр --enable-static-link требует статически линковать исполняемый файл с необходимыми библиотеками, тем самым минимизируя зависимости, а --without-bash-malloc устраняет один не вполне понятный для меня конфликт при линковке. Так же возможно вам захочется добавить свои параметры, включив дополнительный функционал. В моем случае нужен был --enable-array-variables, ради которого все и затевалось.
  5. $ make
    Собираем :-) Если у вас многоядерный процессор, можно добавить параметр -j N, где N - количество параллельных потоков сборки. Обычно его рекомендуют ставить равным удвоенному количеству реальных ядер. Кстати, в моем случае этот параметр существенно ускорил сборку, так что игнорировать его не стоит.

Если все шаги завершились успешно, то мы должны получить в текущем каталоге исполняемый файл bash, о котором утилита file должна говорить примерно следующее:

$ file bash
bash: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.15, not stripped

Обратите внимание на выделенные жирным фрагменты. Если они отличаются, то значит при сборке что-то пошло не так, и bash собрался 64-х битный, либо со внешними зависимостями.

Если хочется, можно немного уменьшить размер бинарника, сделав

$ strip bash

У меня это дало экономию аж в 202365 байта.

Теперь этот файл можно копировать куда угодно и запускать, а он должен работать.

Прощай, FriendFeed


Удалил нафиг ленту блога из френдфида. Хочу видеть реальное количество подписчиков. А заодно и сам аккаунт на френдфиде снес, все равно пользоваться так и не научился.