Blog. Just Blog

Web-мастеру и не только

Полезные решения для Web-мастеров
Web-мастеру и не только - RSS-канал Web-мастеру и не только - Карта сайта

Поиск с учетом морфологии русского языка

20.07.2011 | Категория: Web-мастеру и не только | Автор: ManHunter
Семантический поиск текста с учетом морфологии - серьезная задача, с которой даже крупные поисковики справились с разной степенью успеха. Но частично реализовать поиск с учетом разных форм слов русского языка вы можете самостоятельно. Для этого лучше всего воспользоваться PHP-классом phpMorphy. Это очень удобное средство для организации поиска с учетом морфологии русского, английского, украинского, эстонского или немецкого языков. Словари для каждого языка суммарно занимают около 10 Мб, а сам подключаемый скрипт - чуть меньше 30 Кб. При этом не требуется устанавливать на сервер дополнительное программное обеспечение, все будет работать на самом обычном хостинге.

Начнем с подключения phpMorphy. Это делается очень просто. Сперва скачайте дистрибутив, словари, распакуйте все это в отдельную папку, соблюдая структуру вложенных каталогов. Словари разместите в папке dict. Теперь откроем файл примера из папки examples и посмотрим настройки:
  1. // подключение движка phpMorphy
  2. require_once('src/common.php');
  3.  
  4. // настройки движка
  5. $opts = array(
  6.     ...
  7. );
  8.  
  9. // подключение словарей русского языка
  10. $dir 'dicts';
  11. $dict_bundle = new phpMorphy_FilesBundle($dir'rus');
  12.  
  13. // создание класса
  14. $morphy = new phpMorphy($dict_bundle$opts);
В настройках используется важный параметр storage, он может принимать одно из трех значений: PHPMORPHY_STORAGE_FILE (не загружать файлы словарей в память целиком, это самый медленный вариант, но самый экономный в плане работы с ресурсами сервера), PHPMORPHY_STORAGE_SHM (загружать файл словаря целиком в shared-память, требуется расширение PHP shmop) или PHPMORPHY_STORAGE_MEM (также загружать файл в память целиком если не используется shmop, по скорости работы ничем не отличается от предыдущего). На виртуальном хостинге, скорее всего, придется использовать первый вариант, а на выделенном сервере для большей скорости лучше применять варианты с использованием памяти. Выберите вариант под свои задачи. Остальные настройки и их значения подробно расписаны в официальной документации.

Читать статью целиком »
Просмотров: 17827 | Комментариев: 17

Функции base64 на JavaScript

23.06.2011 | Категория: Web-мастеру и не только | Автор: ManHunter
По умолчанию в JavaScript отсутствуют штатные функции преобразования данных по алгоритму Base64. Ниже приведены две функции для base64-кодирования и декодирования на JavaScript. Их удобно использовать при передаче различных данных через AJAX или через web-формы, а также для хранения в исходном коде бинарных данных, например, зашифрованных строк.
  1. // Функция кодирования строки в base64
  2. function base64encode(str) {
  3.     // Символы для base64-преобразования
  4.     var b64chars 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg'+
  5.                    'hijklmnopqrstuvwxyz0123456789+/=';
  6.     var b64encoded '';
  7.     var chr1chr2chr3;
  8.     var enc1enc2enc3enc4;
  9.  
  10.     for (var i=0i<str.length;) {
  11.         chr1 str.charCodeAt(i++);
  12.         chr2 str.charCodeAt(i++);
  13.         chr3 str.charCodeAt(i++);
  14.  
  15.         enc1 chr1 >> 2;
  16.         enc2 = ((chr1 3) << 4) | (chr2 >> 4);
  17.  
  18.         enc3 isNaN(chr2) ? 64:(((chr2 15) << 2) | (chr3 >> 6));
  19.         enc4 isNaN(chr3) ? 64:(chr3 63);
  20.  
  21.         b64encoded += b64chars.charAt(enc1) + b64chars.charAt(enc2) +
  22.                       b64chars.charAt(enc3) + b64chars.charAt(enc4);
  23.     }
  24.     return b64encoded;
  25. }
Функция декодирования, соответственно, выполняет обратное действие. Дополнительно в ней перед декодированием выполняется очистка исходной строки от символов, которые не относятся к base64-символам. Поэтому функции base64decode можно передавать не цельную строку, а, например, разделенную переносами строк или пробелами для удобства восприятия.

Читать статью целиком »
Просмотров: 15048 | Комментариев: 14

Как сделать свой сервис коротких ссылок

02.06.2011 | Категория: Web-мастеру и не только | Автор: ManHunter
С ростом популярности социальных сетей типа Twitter, где длина сообщения ограничена, возникла необходимость в специальных сервисах для сокращения длинных ссылок. В результате появилось много сайтов, где вы можете ввести длинную ссылку и вместо нее получить короткую. При переходе по такой ссылке вы сперва попадаете на сайт-редиректор, а уже с него выполняется автоматический переход на нужную ссылку. Я даже встречал такие сокращенные ссылки в печатных изданиях, а не только в интернете. Ничего сложного в реализации такого сервиса нет, и сейчас мы сделаем что-нибудь подобное.

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

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

CREATE TABLE IF NOT EXISTS `redirector_links` (
`link_id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'ID ссылки в базе',
`link_hash` VARCHAR(32) COMMENT 'Хэш ссылки',
`link_url` TEXT COMMENT 'Адрес ссылки',
PRIMARY KEY (`link_id`),
KEY `link_hash` (`link_hash`)
) ENGINE=MyISAM

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

Читать статью целиком »
Просмотров: 20715 | Комментариев: 24

Создание древовидного списка из массива

01.05.2011 | Категория: Web-мастеру и не только | Автор: ManHunter
Еще одна из часто встречающихся задач при разработке сайтов - создание многоуровневых древовидных списков. Отдельные элементы списков хранятся в массиве и объединяются между собой через связку полей "ID элемента" - "Родительский элемент". Это могут быть выпадающие меню с несколькими уровнями субменю, каталоги товаров по категориям, карты сайта и т.п. Попробуем описать трехуровневое вложенное меню. Для этого зададим массив вручную, а в реальной ситуации он может быть, например, получен из базы. Количество уровней вложенности может быть произвольным, три уровня выбраны исключительно для примера.
  1. // Построение из массива древовидного списка без использования рекурсии
  2. $menu=array(
  3.      1=>array('name'=>'Овощи''parent'=>0),
  4.          6=>array('name'=>'Капуста''parent'=>1),
  5.          7=>array('name'=>'Помидоры''parent'=>1),
  6.          9=>array('name'=>'Салат''parent'=>1),
  7.              18=>array('name'=>'Китайский салат''parent'=>9),
  8.          12=>array('name'=>'Тыква''parent'=>1),
  9.          16=>array('name'=>'Редиска''parent'=>1),
  10.      2=>array('name'=>'Фрукты''parent'=>0),
  11.          13=>array('name'=>'Бананы''parent'=>2),
  12.          14=>array('name'=>'Ягоды''parent'=>2),
  13.              19=>array('name'=>'Арбуз''parent'=>14),
  14.              20=>array('name'=>'Клубника''parent'=>14),
  15.      3=>array('name'=>'Животные''parent'=>0),
  16.      4=>array('name'=>'Растения''parent'=>0),
  17.          8=>array('name'=>'Конопля''parent'=>4),
  18.          11=>array('name'=>'Мак''parent'=>4),
  19.          17=>array('name'=>'Сахарный тростник''parent'=>4),
  20.      5=>array('name'=>'Насекомые''parent'=>0),
  21.          10=>array('name'=>'Тараканы''parent'=>5),
  22. );
В parent прописан ID родительского элемента для каждого субменю, главное меню (первый уровень) имеет parent=0. Теперь нам надо из этого линейного массива сделать древовидный согласно связям родительских и дочерних элементов. Обычно для этого используется решения с применением рекурсии или же требуется, чтобы исходный массив был специальным образом отсортирован. Но вполне можно обойтись таким вот элегантным решением с использованием ссылок:
  1. // Построение дерева за один проход
  2. foreach($menu as $menu_id=>$data) {
  3.     // Прописать в родительском узле ссылку на пункт меню
  4.     $menu[$data['parent']]['child'][$menu_id]=&$menu[$menu_id];
  5. }
  6.  
  7. // Готовый массив находится в $menu[0]['child']
  8. $sorted_menu=(array)$menu[0]['child'];
Единственное условие, чтобы исходный массив не содержал кольцевых замыканий, это когда родительский элемент ссылается в качестве своего родителя на свой дочерний элемент. Других ограничений нет, массив может быть как угодно отсортирован и иметь "дыры" в нумерации ID.

Читать статью целиком »
Просмотров: 10052 | Комментариев: 11

Выбор случайной строки из таблицы MySQL

20.04.2011 | Категория: Web-мастеру и не только | Автор: ManHunter
Одна из часто встречающихся задач при создании сайтов - выборка случайной строки из таблицы MySQL. Это может быть случайный баннер в ротации, какая-нибудь "фраза дня" или афоризм, промо-блок на главной странице и т.п. Применений масса. Я решил на практике протестировать несколько вариантов решения этой задачи. Исходные данные: база MySQL, таблица типа MyISAM проиндексирована по полю id, количество записей около 500000, поле id обозначено как PRIMARY KEY, в нумерации есть "дырки" из-за удаленных строк.

Переходим к тестированию. Традиционное решение сводится к такому запросу:

SELECT * FROM `table` ORDER BY RAND() LIMIT 1

Код на PHP для тестирования:
  1. // Тест №1
  2. $query="SELECT * FROM `table` ORDER BY RAND() LIMIT 1";
  3. $sql_result=mysql_query($query);
  4. $row=mysql_fetch_array($sql_result);
  5. mysql_free_result($sql_result);
Результаты не радуют. Среднее время выполнения одного такого запроса на моем компьютере занимает 2.5 секунды. На реальном проекте, особенно если он работает под нагрузкой, такие затраты времени недопустимы.

Читать статью целиком »
Просмотров: 12540 | Комментариев: 9

prev 01 ... 21 22 23 24 25 26 27 ... 34 next
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2021
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0019 сек.) / Память: 5 Mb
Наверх