Архив метки: php

Об инструментах

Не холивара ради. Это лишнее доказательство того, что выбор инструмента должен быть оправданным. А не как обычно: «Наша компания предлагает интегрируемые интеграторы интеграторов на глубоко интегрированных технологиях».

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

Брутфорсят админку WordPress

Судя по логам сервера, да и по новостям, бушует очередная эпидемия заражения сайтов на WordPress — причём, в этот раз брутфорсят админки. Что делать?

  • Всегда обновляйтесь. И движок и плагины, особенно кэширующие. Самые замечательные дыры обнаружены как раз во всех популярных кеширующих плагинах.
  • Перенесите wp-config.php на уровень выше из папки блога. WordPress его найдёт.
  • Установите плагин с капчей для входа в админку.
  • Если ваш хостинг поддерживает SSL (ну или у вас свой сервер) в файле wp-config.php определите константу «DEFINE (‘FORCE_SSL_ADMIN’, true);», таким образом, вход в админку будет защищён.
  • Если совсем включить параною, можно вынести все скрипты WordPress за пределы видимости из инета.
  • Избавьтесь от ненужных плагинов.

Сеобезопасная заглушка

Реклама: Musa Motors производит выкуп авто на выгодных условиях.

При очередном апдейте старые домены украли у блога немного PR и ТИЦ. Поэтому решил поставить там заглушки, ибо и редиректы криво светочем российского поиска воспринимаются.

Да, я знаю, можете и сами написать, ничего сложного, просто для экономии времени. В корень сайта бросаем файлы (сменив http://filonov.org на свой домен):

Читать далее Сеобезопасная заглушка

На чём пишете?

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

Разумеется, есть индивидуумы, не меняющие платформу всю сознательную жизнь – но в основном это люди, до пенсии сидящие на окладах в госорганизациях. Знавал одного такого – файлы в Delphi копировал, запуская bat-файлы, определял, запущена ли программа по флагу, создаваемому в корне диска С, данные хранил в текстовых файлах, причём построчно, ибо кроме writeln и readln ничего не удосужился изучить. Знавал и программиста-уборщицу – перевели по знакомству из “отдела клининга”, потому что в Outlook умела письма отправлять – “значить, программист”.

Ещё есть категория кодеров – абсолютно не творческих личностей, разработкой не увлечённых, но хороших специалистов. Их сменить среду может заставить только низкий спрос на текущие знания. Работают только ради денег, о программировании “just for fun” говорить не приходится. Как правило специалисты хорошие, в своих рамках. Сроки соблюдают, пишут качественно, устойчивы к рутине. Впадают в ступор при надобности использовать самостоятельное недокументированное или нестандартное решение, пишут докладные записки о том, что из за “бага компилятора” работу выполнить в принципе невозможно.

Низкими зарплатами и такими специалистами и определяется “качество” государственного ПО.

Итак, моё знакомство с компьютерами проходило примерно так:

Logo (англоязычный)

  • Год: 1991
  • Платформа: Агат

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

image

О платформе без дрожи вспомнить не могу. Агат был первым ПК, разработанным в СССР и выпускался с 1984 года на Лианозовском электромеханическом заводе. Совместим с Apple II и дико дорог и ненадёжен. Пятидюймовый дисковод был в чугунном литом корпусе с сантиметровыми шипами радиатора и мощной пружиной, не позволявшей головке прижаться к дискете. Поэтому в процессе загрузки системный блок нужно было приподнять с одной стороны и держать под углом в 45 градусов к поверхности стола, пока не загрузится операционная система. Тогда я впервые задумался о становой тяге и пауэрлифтинге вообще.

image image

TurboPascal 5.5

  • Год: 1993
  • Платформа: MS-DOS i386

К сожалению, в школе преподавали Pascal. Сейчас я об этом очень жалею, гораздо больше толку было бы от C++. Ну про ООП и TurboVision в школе я так и не узнал, а зря, упустил много времени.

image

Читать далее На чём пишете?

Как в NetBeans включить автодополнение CodeIgniter?

Стандартный совет: создайте в корне проекта файл autocomple.php и перечислите там классы CodeIgniter. А чтобы  автодополнение работало по всему приложению, добавьте также свои собственные модели и классы.

Copy Source | Copy HTML

  1. <?php
  2. /**
    * @property CI_Loader           $load
    * @property CI_Form_validation  $form_validation
    * @property CI_Input            $input
    * @property CI_Email            $email
    * @property CI_DB_active_record $db
    * @property CI_DB_forge         $dbforge
    * @property CI_Table            $table
    * @property CI_Session          $session
    * @property CI_FTP              $ftp
    * @property CI_Benchmark        $benchmark
    * @property CI_Calendar         $calendar
    * @property CI_Image_lib        $image_lib
    * @property CI_Email            $email
    * @property CI_Encrypt          $encrypt
    * @property CI_Exceptions       $exception
    * @property CI_Language         $language
    * @property CI_Pagination       $pagination
    * @property CI_Parser           $parser
    * @property CI_Trackback        $trackback
    * @property CI_User_agent       $user_agnet
    * @property CI_Validation       $validation
    * @property CI_Security         $security
    * @property Excel               $excel
    * @property Blog_model          $Blog_model
    * @property Test_model          $Test_model
    * @property Categoryes_model    $Categoryes_model
    * @property Gallery_model       $Gallery_model
    * @property Menu_model          $Menu_model
    * @property MPTtree             $MPTtree
    * @property Pages_model         $Pages_model
    * @property Portfolio_model     $Portfolio_model
    * @property Rights_model        $Rights_model
    * @property Users_model         $Users_model
    * ...
    */
  3. Class Controller {
  4.  
  5. }

В NetBeans меня немного раздражает, что что открывающая скобка находится на одном уровне с оператором. По гайдлайнам CodeIgniter это не приветствуется, да и мне после C# не особенно облегчает просмотр кода. Глаз быстрее находит открывающую скобку, чем оператор или объявление. Как побороть?

Идём в меню “Tools”, пункт “Options”, закладка “Formatting”. Далее выставляем всё так:

imageПосле этого используем автоформатирование кода (Alt+Shift+F). 

CodeIgniter и Ajax

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

Задача такая: есть дерево меню сайта в админке. Рядом с каждым пунктом меню — кнопка, нажав её, переходим на страницу редактирования свойств пункта меню: ссылки, активности, картинки. Задача следующая — не переходить на другую страницу, как в "суровые девяностые", а используя AJAX открыть тут же, в псевдо всплывающем окне, типа лайтбокса, который заполонил весь инет.

Начнём, как говорят "37 signals", с проектирования интерфейса. Использовать плагины и чужие скрипты не хочется, люблю, чтобы страницы загружались быстро. Поэтому обойдёмся без лайтбокса и jquery tools. Всплывающее окно будет у нас слоем с абсолютным позиционированием и следующими свойствами:

Copy Source | Copy HTML

  1. #divedit
  2. {
  3.      position: absolute;
  4.      z-index:0;
  5.      background: silver;
  6.      display: none;
  7.      top:50%;
  8.      left:50%;
  9.      width: 400px;
  10.      height: 274px;
  11.      margin-left: -200px;
  12.      margin-top: -137px;
  13.      border: gray solid;
  14. }

Читать далее CodeIgniter и Ajax

Ошибка в MPTtree для CodeIgniter

image

Для тех, кто использует модель MPTtree, реализующую вложенные множества в CodeIgniter. Не рекурсией же вы иерархические структуры читаете, смею надеяться?image

В функциях move_to_first_child_of, move_to_last_child_of закралась ошибка. Соответственно, в модели не работает перемещение узлов. Эти же функции используются ORM, поэтому проблема глобальна.

Строки

<?php
if($this->lft != || $node->orphan || $node->instance->tree_table != $this->instance->tree_table
            return 
false;
?>

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

Меняем $this->lft != 1 на $this->lft == 1 и радуемся.

Тем кто не в теме, срочно просвещаться.

P.S. В рассматриваемой модели поле уровня не используется, оно излишне. Необходимо и достаточно левой и правой границы.

image

Мультивордпрессинг

Условия задачи:

  • Создать несколько однотипных блогов.
  • Блоги должны поддерживать удалённую публикацию.

Решение:

От весьма заманчивой идеи расплодить на площадке MaxSite CMS пришлось отказаться сразу, из за отсутствия пока что в нём возможностей удалённой публикации. Точнее, она уже присутствует, но разработанная по стандартам автора и с его же собственным клиентом под Windows.

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

Таким образом я пришёл к Movable Type. Платформа написана на perl и является законодателем моды: именно в ней впервые появиласись технологии OpenID, Trackback и многие другие. Одно из главных преимуществ Movable Type — статическая публикация контента. То есть, страницы не генерируются для пользователя скриптами в момент обращения к серверу, а создаются как старые добрые html-файлы. Одна установка системы теоретически способна обслуживать тысячи блогов на разных доменах, поддоменах, подкаталогах — везде в пределах файловой системы сервера. Так как страницы будут статическими — Digg эффект сервер переживёт.

Из главного достоинства вытекают и главные недостатки. При публикации блога или полной перепубликации в случае смены дизайна вы будете обречены часами смотреть на сообщения вроде: «Публикация записи 2 из 7890».

Админка работает медленно. Крайне медленно. На виртуальном хостинге пользоваться оказалось крайне затруднительно. Сложности возникли и с комментариями – так как хостер не давал доступ к  httpd.conf, алиасы для скриптов прописать не удалось.

Стал экспериментировать с WordPress MU — многопользовательской редакцией. Проблем при установке возникло не меньше, чем с Movable Type. Дело в том, что MU расчитан на блоги либо в подкаталогах, либо в субдоменах. А вот с работой на отдельных доменах опять же возникает проблема. Найденные пути решения при помощи плагинов оказались не без проблем. Другое решение тоже предполагало правку httpd.conf…Финальное решение, как всегда, было простым и изящным.

Установить один раз обычный WordPress на один из доменов, а остальные домены сделать его алиасами. В конфиге изменить жёсткий префикс имён таблиц MySql c ‘wp_’ на динамический, создаваемый на основе $_SERVER[‘HTTP_HOST’]. Найденный кусок кода выглядел так:

$prefix = $_SERVER[«HTTP_HOST»];
$prefix = str_replace(«www.», «», $prefix);
$prefix = str_replace(«-«, «», $prefix);
$prefix = str_replace(«.», «», $prefix);
$table_prefix = $prefix.»_» ; //»wp_»;

Я только заменил str_replace на ereg_replace(“www\.|\-|\.”,””,$prefix).

В паранояльном варианте можно задавать префиксы вида md5($_SERVER[‘HTTP_HOST’].$salt) или вовсе по условиям.

Ещё одна подсказка. При интеграции существующего блога в эту сборку обязательно возникнут проблемы с доступом в админку. В этом случае переименуйте в таблице prefix_options название опции “wp_user_roles” на “prefix_user_roles”, и в таблице “prefix_usermeta” аналогичным образом переименуйте все опции, начинающиеся со старого префикса “wp_”.

Условия задачи:

Имеем один домен, на который установлен WordPress и несколько доменов-алиасов(синонимов) к нему. Ну например, domain.ru как основной домен и alias.ru как его алиас. Так вот, пройдя по ссылке http://domain.ru/wp-admin попадаем в админку первого блога. Соответственно, пройдя по ссылке http://alias.ru/wp-admin попадаем в админку второго блога? Ничего подобного, почему то мы вновь оказываемся в админке первого блога. Разобраться, в чём дело.

Решение:

Читать далее Мультивордпрессинг