julik live

Почему я не люблю чужие скрипты

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


Для начала стало ясно, что скриптованный Блог Моей Мечты отвечает следующим Невероятно Высоким Требованиям:

  • Написан на PHP (чтобы можно было поломать и исправить, если не работает)
  • Не требует базы данных (что на самом деле обьяснимо, поскольу блог - не настолько сложная вещь, чтобы в ней нуждаться)
  • Спокойно обрабатывает данные в кодировке UTF-8 (потому что все остальное уже за гранью нормальности - и давно)
  • Поддерживает Blogger API чтобы можно было не юзать кривой браузерный интерфейс (а браузерные интерфейсы ВСЕГДА кривые)
  • Хранит записи (внутреннюю базу данных) в минимально человекочитаемом формате, чтобы потом можно было быстренько отказаться от одного движка и переползти на другой

После непродолжительного исследования выяснилось, что таких движков НЕТ. Видимо все настолько начитались книжек типа "Научитесь работать с MySQL и PHP в течение десяти секунд", что без Мускуля (к которому я кстати уже давно никаких теплых чувств не питаю) нормальное веб-приложение уже не мыслится. Позорище, между прочим.

Итаке, первое что я нашел, был Pivot, наша местная голландская разработка :) Pivot был установлен на мою машину и испытан. Результат был... нда... такой себе результат. Итак, начинаем жалобы.

Пункт 1. Все PHP - программисты никак не могут обойтись без того чтобы из одного PHP-скрипта писать другие. Это уж как правило. Самосъедающий Ороборос. Естественно редактировать этот код смысла нет (при rebuild-е статичного сайта он собирается заново), содержит он иногда ОЧЕНЬ странные вещи (но об этом потом), комментировать Странные Вещи никто само собой не напрягается. Знаете, что делает мой любимый BBEdit? Так вот, если он находит в исходниках в строковом литерале символ ?> (что означает "конец PHP-блока"), все остальное он считает HTML-ом. В результате этого например половину функций в файле быстро окинуть взглядом нельзя _вовсе_. Что способствует читаемости кода

Пункт 2. Все PHP - программисты без исключения считают, что хранить данные лучше всего В КОДЕ.

$post['header']='меня никто не любит';
$post['body']='длинный рассказ';
и при запуске блога его исполнять. Создатели Pivot пошли дальше - они хранят постинги в сериализованных массивах PHP внутри текстовых файлов.
И ВОТ ДЛЯ ЭТИХ ИДИОТОВ ЧЕЛОВЕЧЕСТВО ПРИДУМАЛО (И ПРОДОЛЖАЕТ ПРИДУМЫВАТЬ) XML!
Такой подход показывает, что авторы уверены, что единственный правильный способ пользования их гениальными веб-приложениями - через их же непримиримо гениальный веб-интерфейс. И никак иначе. То что авторы создают кретинский веб-интерфейс - никого не волнует. При этом например в редакторе постингов в Pivot, при отключенном WYSIWYG-режиме (это такой симулятор Фронтпейджа для секретарш, пользующих CMS, если кто не видел), после каждого возврата каретки автоматически вставляется тег br (в том числе после тегов). Отлично, да? Такие "широкие возможности WYSIWYG" очень способствуют валидации ваших страниц, если кто не в курсе. Все, что в Pivot вводится через формы при подключенном чарсете UTF-8, вовсе пропадает БЕЗ СЛЕДА. Что приятно.

Еще одна радость - что все блоговые приложения просто обажают всю папку, которую вы им отвели, загаживать теми самыми скриптами, которые оин генерят. При этом оверлоад прав доступа на папки естественно лежит на Ваших крэпких плечах (что характерно - ни в коде нив ридми не нашел даже упоминания о том, как это делается НА САМОМ ДЕЛЕ). А самое дело заключается в том, что:

  • папка в которой работает веб-приложение должна быть установлена записываемой для сервера
  • по возможности сервер должен сам создать папку, в которую он будет записывать временные файлы (поскольку тогда он будет owner'ом этой папки

Ни того ни другого автоматически не делается. Чтобы минимально заставить Pivot обновлять постинги, мне приходилось на своем тестовом хосте (трогательно предоставленном моим институтом) PHP-скриптом открывать соединение с сервером, и через это соединения со своими правами назначать папкам и файлам права через SITE CHMOD). Это все зависит от хостера, но даже я знаю, что есть:

  • функция touch, которая легко определяет можно ли писать в папку
  • функция chmod

и я ими пользовался. Позор.

Далее. Работающий Pivot был установлен на мой школьный сервер (проверить). Сразу же вывалился в экран с ошибкой. Проверка экрана с ошибкой выявила, что он не может проинклюдить файл '' (именно так, файл под названием "нуль-строка"). Полез в код - копаться, что там не так.

лучше бы я этого не делал!

Пункт 3. Программисты обожают делать то, что создает проблемы. Вот скажите мне. Есть функция include. И есть функция include_once. ЗАЧЕМ вокруг них городить функцию Fetch, которыя делает исключительно...сверку с масивом уже включенных файлов! Ну есть же предел перверсии! А функция include_once с чем сверяется по-вашему??Включение дебага (который помог бы определить, что же именно под названием "нуль-строка" эта дрянь пытается проинклюдить) помогла лишь выяснить, что она пытается проинклюдить нуль-строку. И PHP в своем сообщении об ошибках сообщил бы то-же самое. И самый отстой в том, что я знаю, почему она инклюдит нуль-строку. Потому-что таков "замечательный предельно оптимизированный способ считывания информации" - через ИНКЛЮД! То есть мы запишем файлики куда-то (например шаблон, кривую сериализованню базу) - а потом будем их инклюдить. Функций работы с файлами не существует. There is no spoon. Тотальная конвергенция хранилища данных с языком программирования - интересно, эти кретины вообще когда-нибудь думали, зачем люди придумали файловые системы и базы данных? Видимо нет. Или они думают, что хостинг - это такой мобильный телефон, и на него можно закачать пару килобайт своего приложения, и по возможности всю графику и все стринги, не говоря уже о хранимой инфе, засувать прямо в байткод. Более того, трассировка сидит в этой идиотской обертке для include_once, а не там, где include использован (то есть нет чтобы сказать "считываю файл такой-то чтобы получить из него функции для того-то и того-то" - таки совершенно нет). Более того - в этой обертке предусмотрена переменная для того, чтобы определить - фатально это или нет - что нельзя файл проинклюдить. Это ребята очень здорово, но вообще-то сама идеология инклюда кода (еслик онечно вы не гнусный извращенец и не инклюдите что-то, скачанное по сети) такова, что ВСЕ ИНКЛЮДЫ нужны, иначе бы их не было. Потому-что инклюдят код. А не самопальные БД. Я бы понял, если бы в таком виде хранились, например, поисковые индексы - короче говоря, второстепенная информация, которая точно необходима только данному приложению, требует быстрого доступа и неможет быть утеряна в случае сбоя

Пункт 4. Куртуазные программисты ну НИКАК не могут взять втолк, что иnclude path на любом PHP- сервере начинается "от точки", то есть инклюдить и открывать файлы можно по относительному пути от скрипта. Нет, нужно нагородить специальный детектор, который определяет, где лежит движок блога, парсить его на части, убирать ненукжное и потом запихивать это в переменную (храня ее естественно в глобали)... Естественно, что мне пришлось эту самую переменную "перебить" вручную (так как машинка не срабатывала), хотя если инклюдить по пути "от скрипта" вся это дерьмо может быть просто не нужно. После этого кривая дрянь решила инклюдить описание класса дважды. Дальше я разбираться не стал а просто слил этот шмак в мусорное ведро. Помимо прочего человек, который эту штуку руссифицировал, пошутил особенно забавно - файл со стрингами он записал в кодировке Win-1251, а кодировку выставил koi-8. R.I.P.

Тем не менее решил попытать счастья еще с движком господина Смирнова ;) и впечатления свои сообщать я не буду (а то придет весь Рунет в мой недавно запущенный блог кидать в меня тухлыми помидорами). Скажу лишь, что бриться бритвой Оккама - не мой метод. Не говоря уж о том, что движок этот у меня не завелся ни на одной из трех тестовых машин (наверняка потому чтоу меня руки неоттуда растут и т.д. - слышали, знаем). Скажу лишь, что запихивать шаблон HTML в один толстый heredoc - это уже слишком. Есть пределы творческому минимализму. В качестве бонуса к Регистру прилагается редактор под Винду (это про наличии в природе Blogger API - виндузятники со своим подходом "в природе никого кроме нас нет" неискоренимы.

Проводимые эксперименты (с моим микродвижком блогов, который я с горя от этих открытий начал писать сам) показывыают, что полный парсинг 500 XML-файлов с постингами занимает 20 секунд - это даже меньше 30-секундного таймаута (на быстром expat-парсере). Отпарсенные файлы можно спокойно кэшировать в сериализованном виде и так далее. И забыть о кривых веб-интерфейсах, вонючих симуляторах фронтпейджа и прочих глупостях, которые приходят в голову разным господамъ. А также об импорте-экспорте (который даже в MT представляет собой проблему. Когда допишу - используем.

А пока что поставил MT. Он написан на Perl, следовательно подправить его я не смогу, но по крайней мере он не оставляет впечатления такого грандиозного, вонючего кладжа, какое дают остальные. И UTF-8 портит только в веб-редакторе постингов (которым я могу спокойно не пользоваться). Работал на всех трех хостах, оснащен нормальными установочными скриптами и так далее. Уроков из этой ситуации я извлек несколько:

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

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

Suspects: Веб-стройка

 
comments powered by Disqus

Aspirine not included.