17 июня не забудьте скачать FireFox 3.

30 комментариев

Firefox Download DayЭто официальная дата релиза отличного браузера и день, в который разработчики установят мировой рекорд по числу загрузок программы за сутки. И мы им в этом поможем.

Если верить данным Google Analytics, то среди моих посетителей более 41% использует этот браузер, но среди моих читателей (минус поисковый траффик) этот процент намного выше.

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

Download Day - Russian

Поэтому жмём по кнопке, обещаем помочь с рекордом, 17 июня скачиваем новую версию FireFox,
и радуемся новым возможностям самого популярного среди блогеров браузера. На данный момент более миллиона пользователей из разных стран пообещали загрузить Firefox 3, в том числе почти 35 тысяч пользователей из России.

И помните, Internet Explorer — это всего лишь программа, которая позволяет скачать FireFox :-)

Жилинский Владимир.



Как сделать облако тегов на PHP.

41 комментарий

Облако тегов«Облако тегов» или «Облако меток» (англ. tag cloud) — визуальное представление списка ярлыков. Частота упоминаний, поисков, ссылок в интернете с определенного сайта неких слов, терминов, имен, отображается в виде изображения этих слов в формате гиперссылок. Размер изображения тем больше, чем выше релевантность данного слова.

Теги для многих удобнее категорий, и, наверное, поэтому без них сейчас не обходится ни один проект в концепциях Web 2.0. Для многих CMS есть модули или плагины, выводящие облако тегов. WordPress поддерживает такую функцию начиная с версии 2.3.

Но мне захотелось вывести такую штуку на самописном движке сайта «Коллеги: 1000 IT-блогов«. Реализация оказалась проще, чем я думал.

  • 1. Создал таблицу соответствий «Тег — Число».
  • 2. Заполнил её (несложная функция, подсчитывающая число вхождений тега в таблице блогов).
  • 3. Рассчитал максимальное значение и исходя из него — популярность каждого тега в процентах.
  • 4. Разделил теги на группы по популярности и назначил им CSS-классы.
  • 5. Подготовил соответствующие CSS-классы для отображения.
  • 6. Вывел облако на страницу блоком.

скачать PHP скриптTagCloud.phps - формирование облака тегов.

В тексте исходника — все инструкции, дамп таблицы и CSS-классы. Посмотреть этот код в действии можно в «Коллегах».

Жилинский Владимир.



Комплект PHP-функций для работы с UTF-8.

20 комментариев

PHP UTF-8Вдогонку к заметкам о морфологическом антимат-фильтре на PHP, функциях для экстренного конвертирования в UTF и обратно и функции для защиты от XSS-атак, публикую потрясающую по полезности находку.

Это полнейший must have для PHP-программистов — если даже и не включать это в готовый код, то для отладки — бесценно. Я уже не знаю, что бы я делал без функции is_utf8, например. Поэтому качаем архив, распаковываем его себе и пользуемся, изучив и сохранив описание.

Этот сборник продвинутых функций для работы с UTF-8 текстом создан коллективным разумом форума программистов и усилиями Рината Мухтарова. Скачать архив.

Далее — список доступных функций и их описания:

1. censure. Функция определяет наличие мата (нецензурных, матерных слов) в тексте. Возвращает false, если мат не обнаружен, иначе обнаруженное матерное слово. Алгоритм достаточно надежен и быстр, в т.ч. на больших объемах данных. Метод обнаружения мата основывается на корнях и предлогах русского языка, а не на словаре, поэтому скорость очень высока.

2. cp1251_to_utf8_recursive. Функция для перекодировки данных произвольной структуры из кодировки cp1251 в кодировку UTF8.

3. cp1259_to_utf8. Конвертирует текст из кодировки cp1259 и cp1251 в кодировку UTF-8.

4. html_template. HTML-ориентированный шаблонизатор с автоматическим квотированим значений меток-заменителей.

5. html_words_highlight. «Подсветка» найденных слов для результатов поисковых систем.

6. hyphen_words. Расстановка «мягких» переносов в словах.

7. is_utf8. Возвращает true усли переданная строка — правильный UTF-8, иначе false.

8. php2js. Конвертирует данные PHP из scalar, array и hash в данные JS в scalar/array/hash.

9. strip_tags_smart. Более продвинутый аналог strip_tags() для корректного вырезания тегов из html кода. Возможности:

— корректно обрабатываются вхождения типа «a < b > c».
— корректно обрабатывается «грязный» html, когда в значениях атрибутов тагов могут встречаться символы < >.
— корректно обрабатывается разбитый html.
— вырезаются комментарии, скрипты, стили, PHP, Perl, ASP код, MS Word теги.
— автоматически форматируется текст, если он содержит html код.
— защита от подделок типа: «<script>alert(‘hi’)script>».

10. textarea_rows. Вычисляет высоту области редактирования текста (<textarea>) по значению и ширине.

11. ucs2_to_utf8. Преобразует строку из кодировки UCS-2 в UTF-8, без использования iconv.

12. utf8_autoconvert_request_charset. Перекодирует значения элементов массивов $_GET, $_POST, $_COOKIE, $_REQUEST, $_FILES из кодировки cp1251 в UTF-8, если необходимо. Побочным положительным эффектом функции является защита от XSS атаки с непечатаемыми символами на уязвимые PHP функции.

13. utf8_check. Пытается определить, находится ли строка в кдировке Unicode.

14. utf8_convert_case. Конвертирует регистр букв в строке в кодировке UTF-8.

15. utf8_escape. Перекодирует строковые объекты так, чтобы они читались везде.

16. utf8_html_entity_decode. Конвертирует все HTML-entities в символы UTF-8.

17. utf8_html_entity_encode. Конвертирует спецсимволы UTF-8 в HTML-entities.

18. utf8_simple_search_sql. Создает условия для простого поискового SQL запроса, основанного на LIKE и REGEXP.

19. utf8_str_limit. Обрезает текст в кодировке UTF-8 до заданной длины, причём последнее слово показывается целиком, а не обрывается на середине.

20. utf8_strlen. Расширенная функция strlen() для работы со строками в utf-8.

21. utf8_substr. Расширенная функция substr() для работы со строками в utf-8.

22. utf8_ucfirst. Преобразует первый символ строки в кодировке UTF-8 в верхний регистр.

23. utf8_ucwords. Преобразует в верхний регистр первый символ каждого слова в строке в кодировке UTF-8, остальные символы каждого слова преобразуются в нижний регистр.

24. utf8_unescape. Функция декодирует строку в формате %uxxxx в строку формата UTF-8.

25. utf8_unescape_recursive. Рекурсивный вариант utf8_unescape().

26. utf8_unescape_request. Корректирует глобальные массивы $_GET, $_POST, $_COOKIE, $_REQUEST, декодируя значения в юникоде, закодированные через функцию javascript escape() ~ “%uxxxx”.

Жилинский Владимир.



СПИК-2008: Присоединяйтесь!

4 комментария

6 июня 2008 года в отеле «Ольгино» состоится III Санкт-Петербургская интернет-конференция (СПИК – 2008), посвященная актуальным тенденциям развития интернета в России и Северо-Западном регионе в частности.

Я для себя примерно набросал следующий маршрут:

СПИК-2008

  • Как повысить эффективность медийной рекламы (Александр ЯКУТСКИЙ).
  • Как повысить эффективность контекстной рекламы (Алексей ДОВЖИКОВ).
  • Интернет-сообщества и социальные сети, секреты успеха (Дмитрий КРАВЧУК).

Для себя можете тоже повыбирать — вот полная программа СПИКа СПИК.

Ещё планирую принять участие в неофициальной мини-конференции Александра Мусаева Лес на СПИКе в кулуарах СПИКа, на которую приглашаются Лес на СПИКе все желающие пообщаться в таком формате.

Жилинский Владимир.



Итоги Russian Blog Awards 2008.

23 комментария

Russian Blog Awards 2008

Подведён итог Russian Blog Awards 2008, этот блог признан лучшим в номинации Блог об Информационных технологиях. А в общем зачёте — 9-е место. Спасибо всем, кто по моей просьбе голосовал за блог!

Не забываем получать регистрации в "Москве".

Жилинский Владимир.



Организация общения с посетителями сайта: варианты.

10 комментариев

Организация общения с посетителями сайтаДовольно интересная тема, особенно важная для интернет-магазинов, сайтов турагенств и прочих оператор-ориентированных сервисов. Стандартный подход в рунете такой: в шапке сайта указывается телефон, в подвале — е-мейл, в лучшем случае есть ICQ или форма обратной связи.

Такой подход явно не располагает посетителей к контакту: я не люблю звонить непонятно куда по телефону (да и зачем, я же в сети), ICQ — это что-то личное, да и для контакта требуется слишком длинная цепочка действий, а по почте мы все знаем, что не дождёмся ответа скорее всего никогда.

На западе решением этой проблемы было озадачено несколько компаний, разработавших всё, что можно найти в Google по запросу «Live Chat Software«, то есть программы для мгновенной связи оператора с посетителем сайта. По некоторым данным, такой механизм в хорошей реализации может увеличить конверсию и, соответственно, продажи более чем на 80% (!). Это вполне логично — задать вопрос специалисту проще, чем лазать по каталогу и легче, чем звонить, искать кого-то в ICQ или ждать ответа по e-mail.

Отсюда логически следует жизненный вопрос: как это реализовать, желательно самостоятельно и бесплатно?

Подход первый. Грамотный.
Будем писать сервис под себя. Самый удобный, открытый и подходящий для этой цели стандарт, на мой взгляд — Jabber Jabber. Берём class.jabber.php class.jabber.php или немного его доработанный вариант PHP Jabber Client PHP Jabber Client и пишем всё, что нам нужно. Для любителей Python: xmpppy xmpppy.

Не нравится XMPP — можно рискнуть и заморочиться с ICQ, например на основе PHP-класса WebIcqPro WebIcqPro или даже Java-библиотеки Joscar Joscar. Я думаю, что ICQ следует использовать только в том случае, когда нет возможности использовать Jabber, так как этот протокол не блещет стабильностью, надёжностью и предсказуемостью. Да и возможность несложного создания Jabber2ICQ гейта даёт Jabber`у дополнительное преимущество.

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

1. Hab.la Hab.la. Весьма удобный сервис, основанный на Jabber. Легко настраивается, не вызывает конфликтов, легко интегрируется в любую страницу, позволяет использовать любой jabber-клиент на стороне оператора. Подробнее про хаблу можно почитать у Дикого Hab.la.

2. Google Talk chatback badge Google Talk chatback badge. Просто и со вкусом, если грамотно оформить, то вполне приемлемо. Но найден недостаток в реализации — сделано с использованием Flash (Google, ЗАЧЕМ?), что ограничивает в общении неанглоязчных пользователей не-windows. Я надеюсь, в Google исправят этот косяк.

Подход третий. Корпоративный.
Самим писать ничего не хочется, бесплатных сервисов мало, хочется чего-то серьёзного — придётся платить. Не буду рекламировать платные сервисы, скажу только, что идеального среди них я тоже не нашёл, так как каждый стремится к изобретению нового двухколёсного транспортного средства. Вот список более-менее дружественных корпоративному пользователю:

  • Веб Мессенджер Веб Мессенджер
  • SiteHelper.NET SiteHelper.NET
  • GoTalk GoTalk
  • LiveContact LiveContact

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

Спонсор статьи: продвижение сайтов от StarDesign. Без комментариев.

Жилинский Владимир.



Началась регистрация на СПИК-2008

15 комментариев

СПИК-2008Третья Санкт-Петербургская интернет-конференция «СПИК – 2008» состоится 6 июня 2008 года в отеле «Ольгино». Эта конференция, проводимая в рамках Северо-Западного этапа всероссийского Интернет-Марафона (РОЦИТ) посвящена развитию интернет-бизнеса в регионе и привлечению внимания компаний к современным сетевым возможносям.

Мои заметки о предыдущих конференциях:

На официальном сайте конференции СПИК-2008 открыта регистрация для бесплатного посещения. Быть всем :-)

Кстати, Антон Попов проводит второй опрос блогосферы для переиздания своей книги о блогах и очень просит всех принять в нём участие Опрос.

Жилинский Владимир.



PHP: фильтр от XSS и SQL-инъекций.

49 комментариев

Защита от XSS-атак и SQL-инъекцийПредлагаю небольшое исследование на тему безопасности веб-приложений и фильтрации вводимых данных. Скорее всего, я ещё вернусь к этой теме, но сейчас больше хочется не писать трехтомник, а сохранить и упорядочить собранное и проверенное. В частности, речь пойдёт о фильтрационной защите от XSS-атак и SQL-инъекций.

В PHP есть ряд специальных функций для работы со строками, применимых для этой цели. Вот они:

strip_tags() — вырезает теги HTML и PHP из строки.

htmlspecialchars() — конвертирует только специальные символы (‘&’, ‘»‘, »’, ‘<‘ и ‘>’) в HTML сущности (‘&amp;’, ‘&quot;’…). Используется для фильтрации вводимых пользователем данных для защиты от XSS-атак.

htmlentities() — конвертирует все символы в строке (кроме букв) в мнемоники HTML. Используется для защиты от XSS, являясь более гибким аналогом htmlspecialchars.

stripslashes() — удаляет заэкранированные символы (после преобразования в сущности предыдущими функциями их незачем экранировать). Обычно используется в связке с проверочной функцией get_magic_quotes_gpc(), показывающей текущую установку конфигурации magic_quotes_gpc.

Эта конфигурация влияет на то, как будут обрабатываться специальные символы, содержащиеся в данных, передаваемых пользователем (массивы $_GET, $_POST, $_COOKIE). При magic_quotes_gpc = 1 эти спецсимволы (одиночные и двойные кавычки, обратный слэш, байт NULL) автоматически экранируются. При magic_quotes_gpc = 0 все данные передаются в таком виде, в каком их ввел пользователь. В последнем случае в целях безопасности требуется обрабатывать передаваемые данные.

mysql_real_escape_string — мнемонизирует специальные символы в строке для использования в операторе SQL с учётом текущего набора символов в кодировке соединения. Иными словами, функция превращает любую строку в правильную и безопасную для MySQL-запроса. Используется для очистки всех данных, передающихся в MySQL-запрос для защиты от SQL-инъекций.

На основе этих данных, можно собрать функцию для однозначной очистки непроверенных данных. Эта функция получает две переменные — строку с введёнными символами и булево значение для определения — требуется ли приведение к MySQL-запросу. Возвращает функция очищенную строку. Конечно, это не панацея, но функцию легко изменить под собственные нужды.

скачать PHP скриптInputClear.phps - фильтрация введённых пользователями данных.

Если кто-то обнаружит ошибки, или знает способ лучше — добро пожаловать в комментарии, мне очень интересно.

Жилинский Владимир.



Резервирование и бэкап — зачем и как.

33 комментария

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

Начнём с сайта. Среднестатистический сайт — это набор файлов на диске и база данных, как правило — MySQL.

С базой данных особых проблем не вижу:

  • для WordPress есть плагин WordPress Database Backup WordPress Database Backup, который сохраняет базу по расписанию и отправляет её на e-mail
  • для других систем можно воспользоваться скриптом Sypex Dumper Sypex Dumper, или настроить дамп и отправку по почте самостоятельно (несколько строк кода).

С сохранением файлов сайта чуть сложнее. Можно просто периодически сохранять их вручную, но можно и автоматизировать.

Сначала заархивируем все файлы сайта в один архив с помощью библиотеки PclZip PclZip:

<?php require_once('pclzip.lib.php');
$date = date('Y-m-d');
$archive = new PclZip("$date.zip");
$v_list = $archive->add('../');
if ($v_list == 0) { die("Error : ".$archive->errorInfo(true)); }

В этом примере $v_list — это относительный путь к архивируемому каталогу или список каталогов и фалов через запятую. Выбирайте сами, что именно нужно резервировать.

После этого можно сделать дамп MySQL базы и добавить его в этот архив, а потом, например, отправить полученный архив по почте с помощью класса PhpMailer PhpMailer и удалить его чтобы не занимал место. Запускать этот процесс можно с помощью планировщика у хостинг-провайдера (у Majordomo бесплатный) или (если это WordPress) с помощью WP-Cron WP-Cron.

Законченного решения я не выложил, но конструктор укомплектован — собирайте кому что нужно, все части надёжны и проверены.

Следующий эпизод — локальный компьютер. Тут стоит сразу определиться — что именно резервировать. Для больших и редко используемых файлов (фото, видео, архивы) я поставил себе под стол старенький компьютер под Ubuntu, настроил NFS и забыл о нём — приходя домой я получаю доступ к этим файлам, а в крайнем случае — можно и удалённо залезть.

А для регулярного бэкапа текущих проектов вполне подойдёт Gmail. Бесплатный почтовый ящик вмещает до 10Gb данных, а самый интересный фокус в том, что его можно подключить как обычный диск — как в Linux GmailFS, так и под Windows GMail Drive. А сохранять туда нужные файлы тоже можно кроном, или его Windows-аналогом — nnCron + nnBackup nnCron.

А заодно посмотрим, что об этом думают другие участники конкурса на лучший способ бэкапа личных данных.

Жилинский Владимир.



Старые проблемы WordPress.

24 комментария

Проблемы WordPressНесмотря на уже довольно «взрослый» номер версии (2.5.1), WordPress пока не избавился от нескольких недостатков, которые с самого начала мешают ему сделать вообще всех.

Помните, чуть больше года назад пользователи, переходящие из ЖЖ (LiveJournal.com) лихорадочно искали удачные сборки Nested Comments + Subscribe To Comments? Я помню.

Проблема первая — древовидные комментарии.

Выходя из того же ЖЖ, новые пользователи ждали и ждут наличия в WordPress привычной и действительно необходимой функциональности — возможности ответить на любой комментарий и получить ответы на e-mail. По какой причине это так и не включили в официальный дистрибутив — загадка. А по какой причине это до сих пор нельзя реализовать без шаманского бубна — большая загадка.

Threaded comments - древовидные ветвящиеся комментарии в WordPress

Вот возможные варианты реализации:

  • Brian’s Threaded Comments (тот самый первый Nested Comments) — криво реализован на JavaScript, с коверканьем кода и превращением установку других плагинов в окончательное шаманство. Требует замены comments.php, не поддерживает стандартный WordPress Plugin API. Иными словами, это даже не плагин — это костыль.
  • Alex’s Threaded Comments — его форк, на вид не отличить.
  • YATCP — упрощённая версия. Очень упрощённая, за счёт этого абсолютно неудобная.
  • WordPress Thread Comment — китайская версия. Немного лучше BTC, но в целом — тот же JavaScript и безумие с кроссбраузерной версткой.
  • Disqus — монстроподобный и избыточно функциональный внешний сервис.
  • Intense Debate — аналог Disqus.

Подводя черту, можно сказать, что нормального, рабочего плагина, основанного на WP Plugin API и работающего без проблем просто нет. В этом блоге никаких threaded-комментариев не будет, пока я не найду или не напишу что-то работоспособное.

Проблема вторая — авторизация.

Писать в каждом блоге своё имя, адрес почты, блога и сколько будет 39+54 все уже порядком подустали, а единой системы авторизации нет даже на горизонте. Нужен аналог Яндекс.Паспорт или Google Accounts, например. Или плагин, который будет работать с аналогичной системой авторизации — с Google это, кажется, даже возможно. Да, есть OpenID — ещё одна группа кривых плагинов:

  • WP-OpenID — в данный момент его можно проверить у меня в комментариях. Мой аккаунт в ЖЖ считает анонимом, но комментарии принимает (!). С Я.Блогами работает отлично, но почему нет вообще никаких настроек? И ЖЖ — это не самый малоизвестный сервис.
  • Alternate OpenID for WordPress — альтернативный и опять же упрощённый до бесполезности вариант.

Есть ещё правда наш русский альтернативный проектOne-Face.ru (его тоже можно попробовать у меня в комментариях). Он построен на собственном протоколе на основе Flash. Однажды зарегистрировавшись и залогинившись, во все подключенные блоги можно авторизоваться в один клик. Это, оказывается, весьма удобно, но создателям ресурса я уже посоветовал озаботиться разработкой не_флэш_версии плагина и дизайном этих модулей.

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

Жилинский Владимир.




© 2007-2010 Блог интернет-разработчика, автор — Zhilinsky.ru.
При использовании информации ссылка на источник обязательна.