Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Генерация последовательности уникальных кодов на PHP

12.10.2013 | Категория: Web-мастеру и не только | Автор: ManHunter
Иногда возникает задача генерации последовательности уникальных кодов по определенному формату. Это могут быть какие-нибудь одноразовые токены, коды лотерейных билетов, серийные номера, scratch-карты, да мало ли чего. Простое использование ГСЧ в этом случае не дает 100% гарантии, так как выдаваемые им значения могут повторяться, а при большом количестве кодов количество повторений будет только расти. Предлагаю вам следующее решение:
  1. // Набор символов для генерации кодов
  2. $str='1234567890ABCDEF';
  3. // Длина кода без учета разделителей
  4. $code_length=16;
  5. // Нужное количество кодов
  6. $codes_count=300000;
  7. // Позиции разделителя (0 - не надо)
  8. $code_separartor=4;
  9.  
  10. $tmp=array();
  11. $str_length=strlen($str)-1;
  12.  
  13. // Цикл до заполнения массива
  14. while (count($tmp)<$codes_count) {
  15.     // Сгенерировать индекс массива
  16.     $code='';
  17.     for ($i=0$i<$code_length$i++){
  18.         // Разделитель можно не добавлять
  19.         if ($i>&& $code_separartor>&& $i%$code_separartor==0) { $code.='-';}
  20.         $code.=substr($strmt_rand(0,$str_length), 1);
  21.     }
  22.     // Или в массив добавится новый элемент, или
  23.     // перепишется поверх уже имеющийся
  24.     $tmp[$code]=1;
  25. }
  26. // Теперь в массиве $codes уникальные коды
  27. $codes=array_keys($tmp);
Коды генерируются гарантированно уникальные (в пределах одной сессии). Это достигается за счет того, что в качестве кода сперва используются ключи массива, а не значения. Даже если какой-либо код будет сгенерирован повторно, то просто перезапишется уже имеющийся элемент массива, а не добавится новый. Отсутствие проверок типа in_array значительно повышает скорость работы генератора. Главный недостаток этого алгоритма в том, что для генерации больших объемов данных потребуется много оперативной памяти. Для особо критичных случаев при выборе символов, составляющих код, лучше использовать не программный ГСЧ, а какой-нибудь аппаратный, чтобы обеспечить максимальную непредсказуемость данных.

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

Загрузка файлов перетаскиванием в окно браузера

21.09.2013 | Категория: Web-мастеру и не только | Автор: ManHunter

Загрузка файлов перетаскиванием в окно браузера

Практически все современные web-сервисы предлагают пользователям такую фичу, как загрузку файлов простым перетаскиванием их в браузер. Это действительно очень удобно, когда надо загрузить сразу несколько файлов, поле загрузки может иметь произвольный вид и форму, т.к. не подвязано на стандартные элементы формы, и еще множество других плюсов. Как же это сделано? Очень просто. Мы уже рассматривали в одной из статей прием и отправку текстовых данных при помощи технологии AJAX, загрузка файлов выполняется не намного сложнее.

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

Подсветка результатов поиска на странице

05.02.2013 | Категория: Web-мастеру и не только | Автор: ManHunter
Сложно представить современный web-сайт без поиска. И хорошим тоном считается не просто выводить все страницы, на которых был найден запрошенный результат, но и как-нибудь выделять искомые слова в тексте. Если контент сайта представляет собой обычный текст без html-разметки, то тут все просто, достаточно использовать что-то типа str_replace. А как быть, если на странице имеются html-теги, и надо выделить только тот текст, который не заключен внутри тегов? Например, нам надо выделить слово "поиск" в такой тестовой строке:
  1. Для поиска и просмотра <a href="/search" title="Результаты поиска">результатов
  2. поиска</aпройдите по поисковой ссылке.
После простой замены она превратится в нечто чудовищное:
  1. Для <b>поиск</b>а и просмотра <a href="/search" title="Результаты <b>поиск</b>а">
  2. результатов <b>поиск</b>а</aпройдите по <b>поиск</b>овой ссылке.
Как видите, текст в атрибутах title нарушен. Это простейший пример, на деле это может привести к полному развалу верстки, а то и еще хуже. При правильно сформированных поисковых запросах злоумышленники смогут даже внедрить в код страницы вредоносные скрипты. Для решения этой проблемы воспользуемся регулярными выражениями:
  1. // Искомая строка для подсветки на странице
  2. $search 'html';
  3. // Создаем строку для регулярного выражения
  4. $pattern "/((?:^|>)[^<]*)(".$search.")/si";
  5. // Подсвеченная строка
  6. $replace '$1<b style="color:#FF0000; background:#FFFF00;">$2</b>';
  7. // Заменяем
  8. $html preg_replace($pattern$replace$html);
Код также немного упрощен для удобства восприятия. В реальных проектах при составлении регулярного выражения $pattern надо обязательно экранировать в искомой строке все служебные символы, которые могут быть использованы в регулярных выражениях.

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

Удаленное управление питанием сервера через Rack PDU

15.12.2012 | Категория: Web-мастеру и не только | Автор: ManHunter

Удаленное управление питанием сервера через Rack PDU

Когда-то по работе возникла необходимость автоматизированного управления серверами в стойке дата-центра. Вопрос с контролем за питанием был решен через power-свич (Switched Rack PDU), который имел возможность удаленного управления по telnet. Для эмуляции действий пользователя я написал вот такой небольшой класс на PHP. Может быть пригодится кому-нибудь еще.

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

Оценка качества изображения для печати

15.10.2012 | Категория: Web-мастеру и не только | Автор: ManHunter

Оценка качества изображения для печати

Качество изображения измеряется в количествах пикселей (точек) на дюйм (1 дюйм = 25.4 мм), единица измерения - dpi (Dots Per Inch). К типографской печати обычно принимаются изображения не менее 150 dpi, а вот для фотопечати качество должно быть уже 300 dpi и больше. Однако, при оценке качества изображения обязательно надо учитывать и размер печати. К примеру, исходный файл из цифромыльницы с разрешением 1200х900 пикселов будет неплохо смотреться на фотокарточке 10х15 см, но для печати на плакате его качества будет недостаточно. А кадры с Nikon D800 разрешением 7360х4912 пикселов можно без проблем распечатать на формате A1 и повесить на стенку.

Для вычисления dpi надо желаемые размеры печати перевести в дюймы, а затем поделить разрешение исходного файла на эти значения по ширине и высоте. Полученные значения dpi и будут искомым результатом оценки качества изображения. Осталось оформить это все вот в такую несложную функцию:
  1. // Функция для расчета dpi изображения
  2. function get_dpi($picture$print_x$print_y) {
  3.     if (file_exists($picture)) {
  4.         list ($x,$y)=GetImageSize($picture);
  5.         if ($x && $y && $print_x && $print_y) {
  6.             // "Повернуть" изображение под размер печати
  7.             if ($print_x<$print_y) {
  8.                 if ($x>$y) {
  9.                     list ($x,$y)=array($y,$x);
  10.                 }
  11.             }
  12.             // Посчитать dpi по ширине и высоте
  13.             $dpi=array(
  14.                 'dpi_x'=>intval($x/($print_x/2.54)),
  15.                 'dpi_y'=>intval($y/($print_y/2.54))
  16.             );
  17.             return $dpi;
  18.         }
  19.         else {
  20.             return false;
  21.         }
  22.     }
  23.     else {
  24.         return false;
  25.     }
  26. }
Параметры функции: $picture - путь к файлу с изображением, $print_x - ширина печати в сантиметрах, $print_y - высота печати в сантиметрах. На выходе массив со значениями dpi по высоте и ширине для данного изображения или false, если файл отсутствует, имеет неправильный формат или заданы неправильные размеры печати. В случае необходимости изображение будет "повернуто" под размер печати.

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

01 ... 14 15 16 17 18 19 20 ... 26
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2025
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 3 (0.0066 сек.) / Память: 4.5 Mb
Наверх