
Пришло время представить широкой публике проект, над которым я работал все последнее время. Знакомьтесь,
phpBB — один из самых лучших open source движков для создания форумов. На нем работают сотни тысяч конференций, многие из которых обладают впечатляющей функциональностью. И несмотря на то, что в базовой комплектации phpBB3 предоставляет практически все, что может понадобиться для создания форума, его истинная сила в модах, написанных сообществом. В настоящий момент только в его официальном каталоге модификаций зарегистрирован 431 мод разной сложности. И еще больше можно найти на форуме, в разделе бета-версий.
Однако, несмотря на усилия phpBB Group, установка модов по-прежнему является непростой задачей для людей, далеких от IT (снобы от phpBB в этом месте замечают, что это как естественный отбор: не справились с установкой мода — нечего вам вообще администрированием форума заниматься, а фрилансеры начинают тонко намекать на свои услуги). Установка модов вручную требует усидчивости и внимательности, а AutoMOD справляется не со всеми модами (и хорошо, если он сам где-нибудь свалится, хуже, если он мод установит, а проблемы обнаружатся недели через три, когда уже и непонятно, откуда у них корни). Кроме того, поиск нужных модов, при условии, что сам толком не знаешь, что ищешь, остается хитрым и увлекательным квестом.
Проблемы, описанные мною, стары как мир phpBB2. На пике популярности phpBB стали появляться команды энтузиастов, которые вручную делали сборки дистрибутивов phpBB2, включающие в себя более или менее широкий набор модов, совершенно необходимых по мнению авторов сборки. Самым известным проектом из этой серии был, наверное phpBB Plus, впечатлявший новичков симпатичной модификацией subsilver и полусотней модов на борту.
Однако, и здесь были свои проблемы. Это и задержки с выходом обновлений (пока команда сборки накатит все новые моды на новую и протестирует, долгая песня...), это и разногласия по набору модов в сборке (на всех не угаодишь), это и "левые" сборки с незаметными бекдорчиками на борту и масса других сложностей.
С выходом phpBB3 количество активно поддерживаемых сборок существенно сократилось благодаря богатому функционалу базового дистрибутива и скорому релизу официального AutoMOD'a, но несколько проектов все же осталось на плаву.
И вот тут-то на сцену выходит phpBB Constructor. Он позволяет самому выбрать состав сборки, которая вам нужна из предлагаемого набора модов, а так же указать нужные вам локализации. После чего эта сборка будет автоматически создана на основе свежайшего дистрибутива phpBB3 и отдана вам :-)
Таким образом, Конструктор выигрывает и у готовых сборок "от умельцев", поскольку вы можете сами выбирать состав сборки, и у упомянутого AutoMOD'a: в него включены моды, решающие наиболее распространенные проблемы, и они заранее протестированы на работоспособность и совместимость. В результате, вы в несколько кликов получаете хороший базовый набор модов, и при желании можете так же расширить его самостоятельно после установки форума.
Я записал небольшой скринкаст, демонстрирующий работу с phpBB Constructor:
Я с удовольствием выслушаю и постараюсь принять к сведению любую конструктивную критику и пожелания. Это касается как функционала конструктора, так и набора модов, который пока невелик, но будет расти (сейчас в очереди на добавление около 25 модов из официального каталога, потом дело дойдет и до модов в состоянии бета-версий).
А пока лишь приведу список наиболее интересный фитч, которые я планирую сделать:
Есть в планах еще и много менее заметных улучшений, которые перечислять не имеет особого смысла.
Кроме того, я и сообщество phpBB в целом будем благодарны, если вы примете участие в локализации модов из Конструктора для разных языков.
Я давно являюсь сторонником open source, и потому планирую как можно больше наработок, вошедших в phpBB Constructor, передать phpBB-сообществу. Сюда относятся и сердце конструктора — MOD Library, и все правки, которые мне приходится вносить в моды для обеспечения совместимости, и другие вспомогательные инструменты. Кроме того, есть публично доступная Зона 51 зона разработки, в которой каждый может наблюдать за ходом разработки и репортить баги.
Немного позже, чем думал (что простительно, ибо дни выдались хлопотные) привожу свои варианты решения упражнения, которое я озвучил в предыдущем посте. Условие повторять не буду, по приведенной ссылке все описано.
В условии было сказано, что надо обрабатывать исключения в методах init(), run() и shutdown(). И хотя это явно не оговаривалось, по логике функционирования эти методы вызываются подряд. Следовательно, можно сделать так:
Ну или, чтобы не нарушать инкапсуляцию, этот код можно завернуть в статический метод в ApiDispatcher.
Достоинства решения:
Недостатки:
Следующее решение приходит в голову практически сразу после прочтения условия, и оно действительно хорошо подходит для решения задачи.
Именно его в комментариях предложил Vladimir Rusinov, за что ему спасибо:
Достоинства решения:
Недостатки решения:
Это решение в конечном итоге я и использовал в своем проекте. Сначала я приведу код, а потом дам дополнительные комментарии:
Здесь я явно использую класс Errors, в котором задефайнены константами все возможные коды ошибок. Кроме того, в нем есть метод, который позволяет по коду ошибки получить его текстовую расшифровку.
В PHP все исключения имеют по умолчанию два поля (есть и другие, но они нас не интересуют): $message = null и $code = 0, сообщение и код ошибки соответственно. Во всех наших исключениях мы переопределяем значение по умолчанию для кода ошибки, чтобы оно соответствовало типу исключения.
Теперь, когда мы создаем исключение, мы можем задать ему сообщение, которое описывает причину его возникновения, и, если надо, можем уточнить и код ошибки. Если же мы сообщение вручную не зададим - оно будет получено через класс Errors. В случае, если мы поймаем "не наше" исключение (типа простого Exception), у него код ошибки будет 0, и класс Errors успешно опишет его как "Unknown exception".
Достоинства решения:
Недостатки решения
Я привел целых три решения задачи и видно, что ни одно из них не является безоговорочно правильным. А это значит, что даже такая простая задача, как описано в этом упражнении, требует внимательного анализа требований к системе и ваших возможностей, как ее разработчика. В моем случае решение 3 оказалось наименьшим злом, и я использовал его. Но запросто может оказаться, что в другой ситуации оптимально "наивное" решение 1.
Хочу предложить программирующей части моей аудитории небольшую задачку, что называется, по мотивам реальных событий. Задачка просто на технику программирования, даже не на алгоритмы, к конкретному языку она, в общем-то, не особенно привязана, лишь бы в нем были предусмотрены исключения.
Есть корневой класс, условно назовем его ApiDispatcher, который управляет основным потоком исполнения. В нем есть три основных метода:
Каждый из этих методов в основном вызывает методы других объектов, из которых могут прилетать исключения. Исключений много разных, для конкретности будем считать, что десятка два, и для всех трех методов набор возможных исключений одинаков (все двадцать штук).
Так же будем считать, что нам на любом этапе доступен метод Client::reportError($error_code, $error_message), который обеспечивает вывод клиенту сообщения об ошибке и прекращение работы программы.
Теперь собственно формулировка проблемы: необходимо во всех трех методах обеспечить обработку всех возможных исключений, для каждого из исключений надо выдать код ошибки и ее текстовое описание, а потом вызвать Client::reportError() с соответствующими параметрами. Замечу, что у исключения может быть задан текст описания ошибки, и в таком случае желательно его сохранить, поскольку он скорее всего будет более информативен, чем стандартная заглушка. В принципе, вы можете модифицировать весь код системы, в т. ч. создавать новые классы и менять существующие, если это необходимо.
Естественно, решение "в лоб" не подходит, поскольку оно неизбежно приведет к большому количеству дублирующего кода.
Как бы вы решили такую задачу? Языки решения принимаются любые в пределах разумного: Java, PHP, C++. Не возбраняется использование языко-специфичных конструкций, если они действительно удобны — расширение кругозора никому лишним не будет ;-)
Я нашел два приемлемых решения, и опишу оба завтра, если их никто не назовет до меня.
Практически всем пользователям знакома утилита top, показывающая интерактивный список процессов, отсортированный по нагрузке на процессор. История этой утилиты идет от 1984 года, когда Уильям ЛеФевр написал такую утилиту для BSD 4.1. С тех пор top или его аналог есть практически в каждой UNIX-подобной ОС.
Годами доказав свою практичность, top вдохновил многих других программистов на разработку похожих утилит, относящихся к разряду must-have на любой Linux-машине, поскольку они дают возможность быстро оценить ситуацию в системе.
htop — это логическое развитие top. Его интерфейс сделан с помощью ncurses, и благодаря этому он предоставляет гораздо больше возможностей по визуализации процессов и общей загрузки системы, а так же значительно более интуитивный интерфейс настройки всего этого.
Эта замечательная утилита выручит вас, когда надо выяснить, кто же это так активно пишет на диск, что все остальные процессы едва ли не колом стоят: она выводит список процессов, отсортированный по скорости чтения/записи на диск. Полезно запускать ее с ключом -o, тогда она не будет засорять вывод процессами, которые на диск ничего не пишут.
Эта утилита аналогична предыдущей, но показывает она загрузку сетевого интерфейса. Надо заметить, что в отличие от двух предыдущих программ, она для работы требует прав root'а, и для запуска ей желательно указать имя интерфейса, который ей надо мониторить с помощью ключа -i.
Все три утилиты (htop, iotop и iftop) позволяют легко и быстро оценить положение дел на вашей машине даже в условиях отсутствия иксов или когда система бодро закапывается в своп и нужно срочно выяснить, почему: в такой ситуации дожидаться запуска графической утилиты — смерти подобно.
В прошлой заметке я сформулировал основные требования к движку блога. Теперь пришло время в общих чертах разобаться с реализацией. На начальном этапе здесь можно сказать совсем немного, поэтому пост будет небольшим.
На самом деле, для меня выбор фреймворка практически очевиден, поскольку я уже имел опыт разработки довольно сложного сайта на Yii Framework и он показал себя с лучшей стороны.
Помимо этого есть еще плюсы в его копилку:
Этот вечер я посвятил просмотру репозитория расширений и нашел там много полезного для себя и будущего движка :-)
Перечислю для истории все проекты, которые я рассматриваю как потенциальную базу для движка:
Кроме того, для всех этих проектов имеет место фактор априорного недоверия к неизвестным мне разработчикам, но это лишь второстепенный момент. В конце концов, мне все равно придется ознакомиться со всем исходным кодом движка.
Внимательное изучение этих проектов мне, видимо, еще предстоит, но я вижу два наиболее вероятных варианта:
Я до сих пор еще не принял окончательного решения, но скорее всего движок будет приватным по двум причинам:
Последние комментарии
/Гость/ 2 недели 5 дней назад
/Гость/ 5 недель 22 часа назад
/Alek$/ 12 недель 3 дня назад
/Alek$/ 12 недель 3 дня назад
/Гость/ 12 недель 3 дня назад
/Гость/ 12 недель 3 дня назад
/marintsSER/ 14 недель 6 часов назад
/Alek$/ 16 недель 3 дня назад
/Виталий/ 16 недель 4 дня назад
/Alek$/ 18 недель 1 день назад