28 декабря 2014 г.

Vagrant + PuPHPet + множество сайтов

При использовании PuPHPet для настройки Vagrant мне не нравится что все сайты которые хочется добавить необходимо перечислить. С одной стороны это хорошо, а с другой не очень - например у меня десяток сайтов с одинаковыми настройками.

Что бы облегчить себе жизнь я решил автоматизировать процесс добавления сайтов.
В качестве сайтов будут добавляться папки из синхронизируемой папки. Т.е. все те папки что попадут в /var/www/

Для того что бы всё это работало необходимо:
1. установить модуль vagrant-hostmanager (его и так необходимо устанавливать при использовании PuPHPet, для того что бы хосты пробрасывались)

2. В файле Vagrantfile необходимо изменить последовательность создания хостов с помощью модуля vagrant-hostmanager. Наполнение данных для него должно происходить после обработки синхронизируемых папок (все папки из синхронизируемых будут считаться доменными именами). Для того что бы это происходило необходимо добавить в код обработки синхронизируемых папок следующий код:

if Vagrant.has_plugin?('vagrant-hostmanager')
  d = Dir.new(folder['source'])
  entries = d.entries
  entries.delete_if { |entry| entry == '.' || entry == '..' }
  entries.map! { |entry| File.join(d.path,entry) }
  entries.delete_if { |entry| File.file?(entry) }
  entries.map! { |entry| entry.gsub(d.path, '') }
  entries.each do |dir|
    hosts.push(dir)
  end
end

После обработки синхронизируемых папок добавить:

if Vagrant.has_plugin?('vagrant-hostmanager')
  if hosts.any?
    if config.vm.hostname.to_s.strip.length == 0
      config.vm.hostname = 'puphpet-dev-machine'
    end
    
    config.hostmanager.enabled           = true
    config.hostmanager.manage_host       = true
    config.hostmanager.ignore_private_ip = false
    config.hostmanager.include_offline   = false
    config.hostmanager.aliases           = hosts.uniq
  end
end

Массив hosts набирается ранее из настройки создаваемых хостов. (Оттуда нужно удалить настройку hostmanager)

3. Добавить в Vagrantfile запуск скрипта

config.vm.provision :shell, , run: 'always', :path => 'hosts.sh'

Сам скрипт положить туда же где и файл Vagrantfile.
Содержимое скрипта:

#!/bin/bash
FOLDERS=`find /var/www/ -maxdepth 1 -name '*' -type d 2>/dev/null| sort|uniq|cut -d / -f 4`

for FOLDER in $FOLDERS;
do
   if [ -n "$FOLDER" ]; then
       if [ -f "/etc/apache2/sites-available/$FOLDER.conf" ]; then
           rm /etc/apache2/sites-available/$FOLDER.conf
       fi
       echo "<VirtualHost *:80>
   ServerName $FOLDER
   ServerAlias www.$FOLDER
   DocumentRoot /var/www/$FOLDER
   LogLevel warn
   <Directory "/var/www/$FOLDER">
           AllowOverride All
           Options Indexes FollowSymLinks MultiViews
           Order allow,deny
           Allow from all
   </Directory>
   ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/$FOLDER/$1

   ## Logging
   ErrorLog "/var/log/apache2/$FOLDER.log"
   ServerSignature Off
   CustomLog "/var/log/apache2/$FOLDER.log" combined
   ## SetEnv/SetEnvIf for environment variables
   SetEnv APP_ENV dev
</VirtualHost>
  " >> /etc/apache2/sites-available/$FOLDER.conf
   a2ensite $FOLDER
   fi
done
/etc/init.d/apache2 restart;


После этого при запуске по команде vagrant up все папки будут синхронизироваться в качестве сайтов. Что бы не перегружать виртуальную машину необходимо выполнить командуvagrant-hostmanager, а потом запустить скрипт hosts.sh на виртуальной машине.

21 ноября 2014 г.

Vagrant x32 (Apache trouble)

При использовании Vagrant совместно с конструктором виртуальной машины, вы можете столкнуться с проблемой что при использовании 32 битной виртуальной машины Apache не будет стартовать а выпадать с подобной ошибкой
Error:
==> default: Notice: /Stage[main]/Apache::Default_mods/Apache::Mod[authz_user]/File[authz_user.load symlink]/target: target changed '../mods-available/authz_user.load' to '/etc/apache2/mods-available/authz_user.load'
==> default: Info: /Stage[main]/Apache::Default_mods/Apache::Mod[authz_user]/File[authz_user.load symlink]: Scheduling refresh of Service[httpd]
==> default: Notice: /Stage[main]/Apache/File[/etc/apache2/mods-enabled/mpm_event.conf]/ensure: removed
==> default: Notice: /Stage[main]/Apache/File[/etc/apache2/mods-enabled/status.load]/ensure: removed
==> default: Notice: /Stage[main]/Apache/File[/etc/apache2/mods-enabled/status.conf]/ensure: removed
==> default: Notice: /Stage[main]/Apache/File[/etc/apache2/mods-enabled/mpm_event.load]/ensure: removed
==> default: Info: /etc/apache2/mods-enabled: Scheduling refresh of Class[Apache::Service]
==> default: Info: Class[Apache::Service]: Scheduling refresh of Service[httpd]
==> default: Notice: /Stage[main]/Main/File[/var/run/apache2/ssl_mutex]/ensure: created
==> default: Info: /Stage[main]/Main/File[/var/run/apache2/ssl_mutex]: Scheduling refresh of Service[httpd]
==> default: Notice: /Stage[main]/Apache::Service/Service[httpd]: Triggered 'refresh' from 74 events
==> default: Info: Creating state file /var/lib/puppet/state/state.yaml
==> default: Notice: Finished catalog run in 514.86 seconds
The SSH command responded with a non-zero exit status. Vagrant
assumes that this means the command failed. The output for this command
should be in the log above. Please read the output to determine what
went wrong. 

Эта проблема возникает из за использования в сборке puppet apache версии 2.4.
Решить можно двумя способами:
- при конфигурировании puphpet указать использование php в качестве php_mod
- подправить файл apache.pp где в районе 11 строки вынести переменную $apache_version из условия и присвоить ей значение $apache_version  = $apache::version::default

9 мая 2014 г.

Vam Shop билять....

Уже не первый раз сталкиваюсь с Vam Shop на фрилансе. Каждый раз поражаюсь говнокоду который продаётся автором VamShop за реальные деньги...

Сегодня до глубины души меня поразило формирование дерева категорий - построение дерева идёт рекурсией где в каждом шаге вызывается SQL запрос. У клиента более 500 категорий и при формировании дерева категорий каждый раз выполнялось 500 запросов. Эти запросы никак не кэшируются, каждый раз 500 запросов... За такое надо бить линейкой по пальцам...


Дополнение 
функция splitPageResults которая разбирает запроса, оказывается регистрозависимая, т.е. нельзя написать запрос SELECT *.... нужно обязательно писать select * а не то вылетим с ошибкой

11 марта 2013 г.

Отправка почты скриптами php через smtp.gmail.com

Сегодня возникла проблема с отправкой почты через php скрипт.  И пароль тот и логин. А оказалось что при двойной авторизации на cерверах gоogle нужно читать статью http://support.google.com/accounts/bin/answer.py?hl=ru&answer=185833 и следовать ей ;)

25 февраля 2013 г.

Допиливание сайтов под себя

Иногда бывает что на любимом сайте что-то поменяли не в лучшую сторону, например сделали что ссылки открываются с помощью javascript хотя и ведут на теже страницы что и раньше. Что бы решить данную проблему рекомендую воспользоваться плагином Greasemonkey. С его помощью можно добавить к любому сайту исполняемый js, который доработает код сайта уже на вашем компьютере.

Пример скрипта, который обработает все ссылки которые стали открываться javascipt и заменит их на самые обыкновенные ссылки. Пример не панацея и сделан под конкретный сайт.

13 февраля 2013 г.

Dropbox и PHP

После работы с Яндекс Диском возникла необходимость работы с DropBox средствами PHP.
Базовая документация от DropBox живёт тут https://www.dropbox.com/developers/start/core

После гугления были найдены следующие готовые классы:
https://github.com/f4bsch/DropPHP
https://github.com/phpmasterdotcom/AccessDropboxUsingPHP
https://github.com/tijsverkoyen/Dropbox

Но в каждом чего то не хватало. В итоге был сделан класс на базе последнего класса:

3 февраля 2013 г.

Яндекс Диск и PHP

Возникла необходимость сохранения данных на Яндкс Диске. Погуглив нашёл класс для работы с ЯндексДиском с помощью базовой авторизации без использования Oauth - https://github.com/KhArtNJava/phpYandexDisk


23 декабря 2012 г.

Запрос на обновление страницы браузера с помощью onbeforeunload

Понадобилось мне сделать запрос на обновление страницы при наличии введённых данных.
Для этого я использовал функцию JavaScript onbeforeunload.
Маленький нюанс использования - что бы запрос на обновление страницы не выводился функция не должна ничего не возвращать.

Пример использования:

    function confirm_page_reload(){
        var no_changes = true;
       .....// проверяем изминения
        if (!no_changes){
            return "На странице остались не сохранённые данные. Вы действительно хотите покинуть страницу?";
        }
    }

    window.onbeforeunload=confirm_page_reload;

18 августа 2012 г.

Не срабатывает print screen

Если у вас не срабатывает клавиша print screen т.е. в буфер ничего не попадает, то возможно запущенна игра World of Tanks, именно она блокирует эту клавишу :)

17 августа 2012 г.

DKIM и PHPMailer 5.1

UPDATE 2 В версии 5.2.9 тоже была ошибка с подписыванием DKIM. Но мой пул реквест поправил проблему. Актуальную рабочую версию брать тут https://github.com/PHPMailer/PHPMailer
 
UPDATE В версии 5.2.9 это всё уже поправлено. Всё что ниже касается версии 5.1


Решил настроить цифровую подпись DKIM для отправляемых писем с сайта.
Для начала решил возложить эту ответственную миссию на  хостера, но к сожалению он предоставлял только устаревший DomainKey-Signature.
Решил прикрутить DKIM на PHPMailer.
Небольшая инструкция:


5 июля 2012 г.

Заметка про PDF

Если надо что-то сохранить в PDF формате и быть уверенным что цвета не исказятся то в настройках программы откуда экспортируем нужно указать такие параметры для PDF
Press Quality
Output->Color->No Conversion

12 июня 2012 г.

Ограничение количества переменных в POST запросе

При переходе на версию php 5.3 несколько моих скриптов перестало корректно работать. Ошибка была в том что не все переменные попадали в результирующий $_POST. Сначала я грешил на post_max_size, но ёё изменение ничего не дало. Анализ phpinfo привёл меня к переменной max_input_vars - она ограничивает максимальное количество переменных которые будут в $_POST. Сумма считается по всем переменным и вложенным массивам. Изменить значение переменной можно только через php.ini, изменение через  ini_set невозможно.

2 мая 2012 г.

«Корни небес» Туллио Аволедо

Всегда было интересно что же напишут иностранцы о апокалипсисе. Первая книга «Британия» оставила двоякое впечатление. Ознакомившись с аннотацией Глуховского в книге итальянского автора ожидал увидеть мрачную Италию с реалистичными персонажами героями, которые выживают в суровых условиях. Поначалу так и было, но потом всё скатилось к противостоянию религиозных фанатиков и ментальными мутантами. Начинали за здравие кончили за упокой. Что интересно итальянцев немного в романе, главные герои -американцы, швейцарцы, французы, россияне. Если вам хочется узнать как выглядит апокалипсис по итальянски то рекомендую почитать эту книгу.

PS Я думаю что в итоге главный герой не дойдет к своей новой цели.

5 апреля 2012 г.

21 января 2012 г.

Deprecated: Function eregi() is deprecated

С недавних пор, при обновлении PHP до версии 5.3.0 стала появляться ошибка:

Deprecated: Function eregi() is deprecated in бла-бла-бла on line 19

Вначале из-за нее не мог пользоваться SquirrelMail, потом и Joomla!(точнее – VirtueMart) начала выдавать эту ошибку. Некоторые скрипты глючат, а некоторые и вовсе отказываются работать. Заметил, что в инете инфы о решении данной проблемы немного, и решил написать этот пост.

Deprecated: Function eregi() – причина возникновения

Вначале я просто хотел найти howto, на тему устранения бага, но копаясь в просторах всемирной информационной помойки, узнал, отчего так происходит. Оказывается, с выходом версии PHP 5.3.0 некоторые функции были признаны устаревшими/отстойными/ненадежными, и были заменены на другие. Очень много современных скриптов уже переписаны с учетом новых функций, но что делать, если у меня старый скрипт, и по каким-то причинам не могу его переписать?

Устраняем ошибку

Неверно сказано, так как любое решение будет похоже на костыль, но выбор не особо богат. Итак, можно пойти несколькими путями:
  1. Переписать PHP – скрипт. Не всегда выгодно/удобно/надежно.
  2. Обновить скрипт. Самый лучший вариант, но не всегда доступно обновление.
     
  3. Использовать более старый PHP. Спорный вариант, так как все-таки лучше иметь более новые версии ПО на кампе
     
  4. Включить в php.ini старые, отжившие свое функции. При этом будут отключены новые аналоги этих функций.
     

Мы в этом посте рассмотрим именно последний вариант, так как он теоретически заработает в любом случае и при любых обстоятельствах. Итак, заходим в php.ini и находим там строчки:

; overload(replace) single byte functions by mbstring functions.
; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(),
; etc. Possible values are 0,1,2,4 or combination of them.
; For example, 7 for overload everything.
; 0: No overload
; 1: Overload mail() function
; 2: Overload str*() functions
; 4: Overload ereg*() functions
;mbstring.func_overload = 0


Последняя строка – это закомментированный параметр php.ini, который указывает, для каких функций сделать откат к старым. По сути, кроме eregi() это решит вопрос и с mail(), и с str*(). Раскомментируем параметр(последняя строчка в приведенном выше коде):

mbstring.func_overload = 0

и зададим параметру значение. Если оно равно нулю, как сейчас – это значит что все устаревшие функции отключены, и вместо них используются новые их «наследники». Если же хотим что-нибудь включить, например, mail() и eregi(), то значение будет равно 5 (типа 1+4). Если нужно включить str*() и eregi(), то значение будет равно 6 (4+2). В общем, по такому принципу выставляем параметр по своим требованиям. Я включу ниже только функцию eregi():

mbstring.func_overload = 4

Замечательно. Теперь перезапускаем наш апач.

#sudo service apache2 restart

Все. Должно работать.

Взято тут http://megabytesp.livejournal.com/2873.html

16 января 2012 г.

«Британия» Гранта Макмастера

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

«Ледяной плен» Игоря Вардунаса

Если вы держите в руках эту книгу и планируете начать чтение, то я очень рекомендую не читать пролог, прочитайте его в конце как эпилог. В остальном всё классически для построения книги :)
Общее впечатление от книги нейтральное, хотя и события разворачиваются интересно, но слишком предсказуемо.
Надеюсь продолжения от этого автора не будет.
Из забавных ляпов книги - размеры крысы главной героини, то она размером с большую собаку, то помещается в ладони.

«Осада Рая» Андрея Буторина

Расскажу, легохонько, об «Осаде Рая» Андрея Буторина. Это вторая книга автора во «Вселенной метро», но как и в первой книге к метро сюжет романа не относится никоим образом. Действие развивается на заснеженном Кольском полуострове. В этой книге нет привычного ощущения замкнутого пространства и постоянной темноты как в других книгах этой серии. Не встречаются тут и монстры с аномалиями в таком количестве как в других книгах. С одной стороны это и плюс и минус этого романа.
Проблемы главного героя Нанаса иногда кажутся надуманными, а некоторые события приключающиеся с ним и вовсе невероятными. Его первобытный взгляд на вещи иногда умиляет. Отношения остальных героев вкладываются в обычные рамки взаимоотношений, даже несмотря на апокалипсис, ничего людей не меняет.

Стиль написания очень лёгкий, книга читается буквально за 3-4 часа.
Кому понравился роман  «Север» тот прочтёт эту книгу с удовольствием, для остальных это будет просто книжка в коллекцию «Метро 2033».


11 декабря 2011 г.

Франсуа Рабле - роман «Гаргантюа и Пантагрюэль»

Последнее время у меня часто возникает желание перечитать всю школьную литературу. Иногда я узнаю что-то новое открыв новые грани произведения, а иногда впечатления со времён школы не изменяются.
В этот раз мне захотелось перечитать «Гаргантюа и Пантагрюэль». Из школы я запомнил что там главный герой подтирался утятами и был великаном обжорой :)
Первая книга романа о Гаргантюа была прочитана довольно быстро и понравилась мне высмеиванием общественного строя того времени, но прочтение оставшихся четырёх книг заняло у меня больше двух месяцев, что для меня очень и очень долго. Почему то история  Пантагрюэля для меня была не столь интересна, хотя стоит отметить что отдельные главы были весьма интересны.
В итоге школьные впечатления от данного романа у меня мало изменились, они лишь дополнились новыми интересными заметками :)
Кратко отмечу что мне понравилось:
  • Телемское аббатство - весьма правильная идея, я бы и сам не отказался жить в таком аббатстве :)
  • Версия Панурга о долгах :) Суть ёё в том что если бы никто никому не был должен то мир бы умер
  • Остров с котами воплощающих в себе повадки судей, весьма похоже на сегодняшних судей ;)
  • Остром птиц, на котором была птица Папец :)
  • Лечение истощения постригом в монахи с комментарием,если в течении трёх месяцев, будучи монахом, вы не зажиреете, то тут медицина и природа бессильна :)
И несколько цитат:
  • амуры это страсть праздных умов
  • помощь богов добиваются отнють не одними обетами и бабьим воем. Бдением, трудами, доблестью достигается желанный успех во всех делах

24 октября 2011 г.

«Во мрак» Андрея Дьякова

Так как сайт аниме-магазина не работает по причине смены DNS адресов у меня нашлось время написать впечатления о книге «Во мрак» Андрея Дьякова.
Ёщё первая книга этого автора «К свету» понравилась своей атмосферой и насыщенностью.
Вторая часть начинается, ни много ни мало, с ядерного взрыва на острове приютившем главных героев в предыдущей части. С этого и начинаются приключения главных героев, причём вовлечены они в них против своей воли. Нестандартные повороты сюжета и загадки до конца книги доставляют удовольствие. Приятно радует нелинейность и продуманность сюжета. В послесловии автор сообщает что сотрудничал с автором книги «Питер» Шимуном Врочеком, и видно что это сотрудничество было плодотворным, нет разногласий в описании метро Питера и книги этих двух авторов описывают единый мир. Хотелось бы прочитать в следующих книгам серии «Метро 2033» о питерском «Эдеме» ведь засвечен он был не в одной книге и хотелось бы уже получить роман о жизни в «Эдеме». Книгу рекомендую к прочтению всем кто любит пост апокалипсис, а те кто читал «К свету» к прочтению обязательно ;)

PS Судя по финалу книги можно ожидать третьей книги от Андрея Дьякова

23 октября 2011 г.

«Станция-призрак» Анны Калинкиной

Продолжаю читать все новинки из серии «Метро 2033», но руки написать отзывы всё не доходят. Вот уже на полке лежит последняя книга из серии «Британия», а я только о «Станции призрак» пишу.
Но лучше уж поздно чем никогда, заодно и отфильтрую то что больше всего запомнилось. :)
Книгу я начитал читать со скепсисом - как женщина может нормально написать о пост апокалипсисе? В принципе так и получилось, роман ничем особенным мне не запомнился, нет ощущения пост апокалипсиса, всё сводится больше к человеческим отношениям с примесью дикости. Да, люди стали дикими в метро, приносят в жертву девушек, убивают за ничтожные вещи, но этого достаточно и в обычных детективах и женских романах. Вспомнить что-то из этого романа что мне особенно запомнилось я не могу, он у меня прошёл как очередная серия в любимом сериале, да не очень, но следующая должна быть лучше. Так и оказалось книга «Во мрак» Андрея Дьякова оказалась отличным образчиком серии «Метро 2033», но о ней в другой раз :)

16 октября 2011 г.

Книжка на пару часов %)

Дело это было в августе во время концерта HITT. Т.к. я был одним из организаторов этого концерта, но не являюсь поклонником jrock музыки я сидел в кассе по продаже билетов и скучал, т.к. продаж практически и не было :(
Вот так скучая я нашёл в кассе книжечку авторства Левин Айра "Поцелуй перед смертью".
Как по мне это дамский детективчик сродни Донцовой.
Сюжет простой: молодой парень хочет получить от жизни всё не особо напрягаясь и решает что лучший вариант для этого жениться на богатенькой девочке. Первая его пассия беременеет и он решает что лучший способ решить проблему это... убить ёё. Как вам решение проблемы? ;) С грехом пополам он это делает. Вы думаете после этого он поплатился или решил встать на путь праведный? Конечно же нет. Он решает охмурить сестру своей первой пассии, ведь она тоже дочка богатого папика :) Тут вроде как всё идёт как надо и свадьба уже не за горами, но невеста почему решает узнать почему погибла ёё младшая сестра. А т.к. убийца это ёё жених, всё закручивается по новой и ему приходиться убить свою невесту. Парень в погоне за успехом не останавливается и пытается подбить клинья к третьей самой старшой сестре. Как вам? ;) Тут тоже всё складывается великолепно, но внезапно к отцу этих сестёр приходит молодой детектив который рассказывает отцу о странной закономерности в выборе женихов у сестёр. Ну а дальше как обычно отец сначала не верит, но под натиском доказательств уступает и потом все трое (отец, старшая сестра и детектив) прессуют негодяя и он погибает в доменной печи :)
Книжку я прочитал часа за два.

При написании данной заметки решил погуглить что это за автор. Оказывается это довольно известный автор Левин Айра и это был его первый детективный роман за который он получил получил премию Эдгара По. А в 1956 году был даже снят фильм по этому роману. Вот так бывает что в 50-х это увлекательный роман, а в 21 веке это уже дешёвый бульварный романчик. Всё течёт всё меняется...

31 июля 2011 г.

Утренние пробежки :)

На протяжении двух месяцев я бегал каждое утро, за это время я пробежал 230 км, сжёг 23140 калорий и потратил на это 23 часа 43 минуты :)

Роман «Госпожа Бовари»

После прочтения Хемингуэя решил пройтись по классике и взялся за роман «Госпожа Бовари» Флобера.
Несмотря на то что роман написан в далёком 1856 году, его действие может быть смело перенесено и в наше время.  Вот только Шарль будет не доктором а менеджером среднего звена, Эмма  будет гламурной тёлочкой, которая будет тусить по дискотекам, на одной из которых ёё и подцепит Родольф. Сам Родольф будет сыном богатого олигарха и без труда вскружит голову Эмме. Леон же будет обычным ботаном, но жизнь в столице его изменит. Эмма задолжает банку денег и в конечном итоге перережет себе вены т.к. мышьяка достать не сможет. В остальном роман не претерпит никаких изменений.
Что меня поразило, то это отсутствие в романе положительных героев, все имеют какой то изъян, что в принципе придаёт роману реалистичность жизни. Как я узнал позже роман написан на реальных событиях и описывает жизнь семьи Делама, хотя Флобер этот факт и отрицал.

Рекомендую к прочтению всем кто подзабыл что читал в школе либо же вообще профилонил и не читал данный роман ;)


9 июля 2011 г.

Эрнест Хемингуэй - повесть «Старик и море»

Решил перечитать «Старик и море» Эрнеста Хемингуэя.
Не зря за эту повесть дали Пулитцеровскую премию, а затем и Нобелевскую премию. Очень сильно и реалистично написано. В отличии от романа «Прощай оружие» нет такого непроглядного пессимизма, хотя всё и заканчивается не очень радужно. Фраза рыбака Сантьяго - «человека можно уничтожить, но нельзя победить» неоднозначна, как по мне победить и уничтожить можно, но вероятно имеется ввиду что нельзя победить внутреннее Я человека, но опять же спорно. А что вы думаете насчёт этой фразы?

20 июня 2011 г.

Защита email от спамеров с помощью JavaScript и PHP

В процессе допиливания сайта столкнулся с проблемой защиты email адрессов от спамеров. Проблема заключалась в том что email может быть вставлен в произвольный текст в произвольной форме. Вот примеры как он может быть вставлен:

<a href="mailto:email@amail.com">email@amail.com</a>
<a href="mailto:email@amail.com">anytext</a>
<a href="mailto:email@amail.com"><img anything></a>
<a href="mailto:email@amail.com?subject=Text">email@amail.com</a>
<a href="mailto:email@amail.com?subject=Text">anytext</a>
и просто email@amail.com.

И вот это всё надо как-то вычленить и закрыть от спамеров.
Погуглив обнаружил различные варианты защиты email вот хорошая статья на Хабре на эту тему http://habrahabr.ru/blogs/webdev/22549/

Решил использовать вариант с защитой с помощью JavaScript, вроде как самый надёжный.
Решив не писать свой велосипед с квадратными колёсами порывшись в инете нашёл плагин к Joomla - "Email Cloacker", который и делает что мне нужно, вот только делает он это для Joomla, а мне нужно его было от этого отвязать. В результате сделал класс EmailCloacker который обрабатывает нужный мне текст и заменяет email на JavaScript.
Код класса в продолжении записи. Может кому то пригодится.

3 июня 2011 г.

«Ниже ада» Андрея Гребенщикова

      Прочитал недавно книгу «Ниже ада» Андрея Гребенщикова из серии «Вселенная метро 2033». Приятно удивил размер шрифта, не 16 и не 14 как в предыдущих книгах, что не добавляло им плюсов.
      Книга о постядерном Екатеринбуре, город в котором я не был и для меня эта книга сродни книге о вымышленном городе.
       Роман в целом мне понравился, за исключением жуткой фантастики о влиянии радиации на ментальные способности людей и животных. Чего стоит призрак девушки появившийся в результате ёё смерти возле контейнеров с радиационным отходами и умеющий управлять мутантами и влиять на людей.
       Впервые в серии появились вертолёты, до этого были только наземные и подводные транспортные средства. Жаль что оба вертолёта были уничтожены.
     
        Жду следующих книг этой серии, особенно о Киеве и Европе.