Быстрый поиск
Введите фрагмент названия статьи для поиска
Удаленное управление питанием сервера через Rack PDU
15.12.2012 | Категория: Web-мастеру и не только | Автор: ManHunter
Удаленное управление питанием сервера через Rack PDU
Когда-то по работе возникла необходимость автоматизированного управления серверами в стойке дата-центра. Вопрос с контролем за питанием был решен через power-свич (Switched Rack PDU), который имел возможность удаленного управления по telnet. Для эмуляции действий пользователя я написал вот такой небольшой класс на PHP. Может быть пригодится кому-нибудь еще.
Читать статью целиком »
Просмотров: 5381 | Комментариев: 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 и будут искомым результатом оценки качества изображения. Осталось оформить это все вот в такую несложную функцию:
Code (PHP) : Убрать нумерацию
- // Функция для расчета dpi изображения
- function get_dpi($picture, $print_x, $print_y) {
- if (file_exists($picture)) {
- list ($x,$y)=GetImageSize($picture);
- if ($x && $y && $print_x && $print_y) {
- // "Повернуть" изображение под размер печати
- if ($print_x<$print_y) {
- if ($x>$y) {
- list ($x,$y)=array($y,$x);
- }
- }
- // Посчитать dpi по ширине и высоте
- $dpi=array(
- 'dpi_x'=>intval($x/($print_x/2.54)),
- 'dpi_y'=>intval($y/($print_y/2.54))
- );
- return $dpi;
- }
- else {
- return false;
- }
- }
- else {
- return false;
- }
- }
Читать статью целиком »
Просмотров: 6908 | Комментариев: 2
Скрипт для проверки местонахождения и статуса посылок
21.06.2012 | Категория: Web-мастеру и не только | Автор: ManHunter
Для отслеживания почтовых отправлений на сайте Почты России сделана специальная страничка. Когда вы ждете одну-две посылки, то можно воспользоваться ей. Для автоматического отслеживания нескольких посылок также есть специальные сервисы, они самостоятельно опрашивают сайт Почты и сохраняют полученные результаты у себя в базе. Но для отслеживания большого числа посылок, как правило, на подобных сервисах требуется переходить на платные тарифы. Когда я столкнулся с такой ситуацией, то вариант с оплатой, естественно, сразу же был отвергнут как неприемлемый. Проще было самому написать некое подобие такого сервиса, но заточенного под свои нужды. Вот что у меня получилось:Code (PHP) : Убрать нумерацию
- <?
- // Массив с трек-номерами посылок
- // заполняйте его по аналогии трек-номерами своих посылок
- $codes=array('RA111111111CN', 'RA222222222CN', 'RA33333333CN');
- // Массив с результатами отслеживания
- $status=array();
- $link='http://www.russianpost.ru/resp_engine.aspx?Path='.
- 'rp/servise/ru/home/postuslug/trackingpo';
- foreach ($codes as $code) {
- // Подготовка запроса cURL
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, $link);
- curl_setopt($ch, CURLOPT_HEADER, 0);
- curl_setopt($ch, CURLOPT_POST, 1);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_POSTFIELDS, 'entryBarCode='.$code.
- '&BarCode='.$code.'&searchsign=1');
- // Отправка POST-запроса на сервер и получение страницы результата
- $grab=curl_exec($ch);
- if (eregi('value="([0-9]+)"',$grab,$pocket)) {
- // установка URL и других необходимых параметров
- curl_setopt($ch, CURLOPT_URL, $link);
- curl_setopt($ch, CURLOPT_HEADER, 1);
- curl_setopt($ch, CURLOPT_POST, 1);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_POSTFIELDS, 'key='.$pocket[1]);
- // загрузка страницы
- $grab=curl_exec($ch);
- // установка URL и других необходимых параметров
- curl_setopt($ch, CURLOPT_URL, $link);
- curl_setopt($ch, CURLOPT_HEADER, 1);
- curl_setopt($ch, CURLOPT_POST, 1);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_POSTFIELDS, 'entryBarCode='.$code.
- '&BarCode='.$code.'&searchsign=1');
- // загрузка страницы
- $grab=curl_exec($ch);
- }
- // Фикс кодировки полученной страницы
- $grab=mb_convert_encoding($grab, 'Windows-1251', 'UTF-8');
- // Небольшой фикс для упрощения парсинга страницы
- $grab=eregi_replace('<a href=javascript\:Wind\([^\(]*\)>','',$grab);
- preg_match_all('/<tr align="center"><td>([^<]+)<\/td><td>([^<]+)'.
- '<\/td><td>[^<]*<\/td><td>([^<]+)<\/td><td>([^<]*)<\/td>/',$grab,$matches);
- $st=array();
- $st['code']=$code;
- // Если получен какой-то результат
- if (count($matches[1])) {
- // Последнее действие
- if ($matches[4][count($matches[1])-1]) {
- $st['action']=$matches[4][count($matches[1])-1];
- }
- else {
- $st['action']=$matches[1][count($matches[1])-1];
- }
- // Дата последнего действия
- $st['date']=$matches[2][count($matches[1])-1];
- // Местонахождение посылки
- $st['where']=$matches[3][count($matches[1])-1];
- }
- // Ошибка на сервере или статус посылки еще не определен
- else {
- $st['action']='Неизвестно';
- $st['date']='--';
- $st['where']='--';
- }
- // Записать результат в массив
- $status[]=$st;
- curl_close($ch);
- }
- // Теперь в массиве $status содержится информация по всем посылкам
- var_dump($status);
- ?>
Читать статью целиком »
Просмотров: 10795 | Комментариев: 20
Функция для отображения размера файла
21.05.2012 | Категория: Web-мастеру и не только | Автор: ManHunter
Размер файлов в PHP измеряется в байтах, но числа из большого количества цифр для восприятия очень неудобны. На мой взгляд гораздо нагляднее, если размер больших файлов будет отображаться в килобайтах, мегабайтах и так далее. Для этого я нарисовал вот такую вспомогательную функцию:Code (PHP) : Убрать нумерацию
- function bytes2words($size) {
- for($i=0; $i<count($st=array('Кб','Мб','Гб')); $i++) {
- if (($size/=1024)<1024) { $i++; break; }
- }
- return round($size,2).' '.$st[($i-1)];
- }
Code (PHP) : Убрать нумерацию
- echo bytes2words(1000).'<br>'; // 0.98 Кб
- echo bytes2words(10000).'<br>'; // 9.77 Кб
- echo bytes2words(100000).'<br>'; // 97.66 Кб
- echo bytes2words(1000000).'<br>'; // 976.56 Кб
- echo bytes2words(10000000).'<br>'; // 9.54 Мб
- echo bytes2words(100000000).'<br>'; // 95.37 Мб
- echo bytes2words(1000000000).'<br>'; // 953.67 Мб
- echo bytes2words(10000000000).'<br>'; // 9.31 Гб
- echo bytes2words(100000000000).'<br>'; // 93.13 Гб
- echo bytes2words(1000000000000).'<br>'; // 931.32 Гб
- echo bytes2words(10000000000000).'<br>'; // 9313.23 Гб
- echo bytes2words(100000000000000).'<br>'; // 93132.26 Гб
Code (PHP) : Убрать нумерацию
- echo bytes2words(100000000000).'<br>'; // 93.13 Гб
- echo bytes2words(1000000000000).'<br>'; // 931.32 Гб
- echo bytes2words(10000000000000).'<br>'; // 9.09 Тб
- echo bytes2words(100000000000000).'<br>'; // 90.95 Тб
Просмотров: 4752 | Комментариев: 4
Подсветка синтаксиса MySQL-запросов
07.04.2012 | Категория: Web-мастеру и не только | Автор: ManHunter
При выводе диагностики в своих рабочих проектах я использую вот такую функцию для подсветки синтаксиса MySQL-запросов. Она преобразует текст запроса, делая все служебные слова языка заглавными буквами и подсвечивает их цветом, а также выделяет различными цветами числовые значения и скобки. Такая подсветка позволяет сразу же увидеть синтаксические ошибки, да и вообще повышает наглядность сообщений при отладке скриптов.Code (PHP) : Убрать нумерацию
- //-------------------------------------------------------------------
- // Функция подсветки синтаксиса MySQL-запроса
- // (C) ManHunter / PCL
- // http://www.manhunter.ru
- //-------------------------------------------------------------------
- function mysql_debug($query) {
- $tmp=htmlspecialchars($query);
- $tmp=str_replace("\r",'',$tmp);
- $tmp=trim(str_replace("\n","\r\n",$tmp))."\r\n";
- $quote_list_text=array();
- $quote_list_symbols=array();
- $k=0;
- $quotes=Array();
- // Обработать экранированные кавычки
- preg_match_all("/\\\'|\\\"/is", $tmp, $quotes);
- array_unique($quotes);
- if (count($quotes)) {
- foreach($quotes[0] as $i) {
- $k++;
- $quote_list_symbols[$k]=$i;
- $tmp=str_replace($i, '<symbol'.$k.'>', $tmp);
- }
- }
- $matches=Array(
- "/("|'|`)(.*?)(\\1)/is", // текст в кавычках
- "/\/\*.*?\*\//s", // текст комментария
- "/ \-\-.*\x0D\x0A/", // текст ' --' комментария
- "/ #.*\x0D\x0A/", // текст ' #' комментария
- );
- // Обработать текст
- foreach($matches as $match) {
- // Обработать текст
- $found=array();
- preg_match_all($match, $tmp, $found);
- $quotes=(array)$found[0];
- array_unique($quotes);
- if (count($quotes)) {
- foreach($quotes as $i) {
- $k++;
- $quote_list_text[$k]=$i;
- $tmp=str_replace($i, '<text'.$k.'>', $tmp);
- }
- }
- }
- // Служебные слова MySQL
- $keywords=Array(
- "avg", "as", "auto_increment", "and", "analyze", "alter",
- "asc", "all", "after", "add", "action", "against",
- "aes_encrypt", "aes_decrypt", "ascii", "abs", "acos",
- "asin", "atan", "authors", "between", "btree", "backup",
- "by", "binary", "before", "binlog", "benchmark", "blob",
- "bigint", "bit_count", "bit_or", "bit_and", "bin",
- "bit_length", "both", "create", "count", "comment",
- "check", "char", "concat", "cipher", "changed", "column",
- "columns", "change", "constraint", "cascade", "checksum",
- "cross", "close", "concurrent", "commit", "curdate",
- "current_date", "curtime", "current_time",
- "current_timestamp", "cast", "convert", "connection_id",
- "coalesce", "case", "conv", "concat_ws", "char_length",
- "character_length", "ceiling", "cos", "cot", "crc32",
- "compress", "delete", "drop", "default", "distinct",
- "decimal", "date", "describe", "data", "desc",
- "dayofmonth", "date_add", "database", "databases",
- "double", "duplicate", "disable", "datetime", "dumpfile",
- "distinctrow", "delayed", "dayofweek", "dayofyear",
- "dayname", "day_minute", "date_format", "date_sub",
- "decode", "des_encrypt", "des_decrypt", "degrees",
- "decompress", "dec", "engine", "explain", "enum",
- "escaped", "execute", "extended", "errors", "exists",
- "enable", "enclosed", "extract", "encrypt", "encode",
- "elt", "export_set", "escape", "exp", "end", "from",
- "float", "flush", "fields", "file", "for", "fast", "full",
- "fulltext", "first", "foreign", "force", "from_days",
- "from_unixtime", "format", "found_rows", "floor", "field",
- "find_in_set", "group", "grant", "grants", "global",
- "get_lock", "greatest", "having", "high_priority",
- "handler", "hour", "hex", "insert", "into", "inner",
- "int", "ifnull", "if", "isnull", "in", "infile", "is",
- "interval", "ignore", "identified", "index", "issuer",
- "integer", "is_free_lock", "inet_ntoa", "inet_aton",
- "instr", "join", "kill", "key", "keys", "left", "load",
- "local", "limit", "like", "lock", "lpad", "last_insert_id",
- "logs", "length", "longblob", "longtext", "last", "lines",
- "low_priority", "locate", "ltrim", "leading", "lcase",
- "lower", "load_file", "ln", "log", "least", "month", "mod",
- "max", "min", "mediumint", "medium", "master", "modify",
- "mediumblob", "mediumtext", "match", "mode", "monthname",
- "mid", "minute", "master_pos_wait", "make_set", "null",
- "not", "now", "none", "new", "numeric", "no", "natural",
- "next", "nullif", "national", "nchar", "on", "or",
- "optimize", "order", "optionally", "option", "outfile",
- "open", "offset", "outer", "old_password", "ord", "oct",
- "octet_length", "primary", "password", "privileges",
- "process", "processlist", "purge", "partial", "procedure",
- "prev", "period_add", "period_diff", "position", "pow",
- "power", "pi", "quick", "quarter", "quote", "right",
- "repair", "restore", "reset", "regexp", "references",
- "replace", "revoke", "reload", "require", "replication",
- "read", "rand", "rename", "real", "restrict",
- "release_lock", "rpad", "rtrim", "repeat", "reverse",
- "rlike", "round", "radians", "rollup", "select", "sum",
- "set", "show", "substring", "smallint", "super", "subject",
- "status", "slave", "session", "start", "share",
- "straight_join", "sql_small_result", "sql_big_result",
- "sql_buffer_result", "sql_cache", "sql_no_cache",
- "sql_calc_found_rows", "second", "sysdate", "sec_to_time",
- "system_user", "session_user", "substring_index", "std",
- "stddev", "soundex", "space", "strcmp", "sign", "sqrt",
- "sin", "straight", "sleep", "text", "truncate", "table",
- "tinyint", "tables", "to_days", "temporary", "terminated",
- "to", "types", "time", "timestamp", "tinytext",
- "tinyblob", "transaction", "time_format", "time_to_sec",
- "trim", "trailing", "tan", "then", "update", "union",
- "using", "unsigned", "unlock", "usage", "use_frm",
- "unix_timestamp", "unique", "use", "user", "ucase",
- "upper", "uuid", "values", "varchar", "variables",
- "version", "variance", "varying", "where", "with",
- "warnings", "write", "weekday", "week", "when", "xor",
- "year", "yearweek", "year_month", "zerofill");
- $replace=Array();
- foreach($keywords as $keyword) {
- $replace[]='/\b'.$keyword.'\b/ie';
- }
- // Выделить служебные слова в тексте запроса
- $tmp=preg_replace($replace,
- '"<b style=\"color:#0000FF\">".strtoupper("$0")."</b>"',$tmp);
- // Выделить числовые значения в тексте запроса
- $tmp=preg_replace('/\b([\.0-9]+)\b/',
- '<b style="color:#008000">\1</b>',$tmp);
- // Выделить скобки в тексте запроса
- $tmp=preg_replace('/([\(\)])/',
- '<b style="color:#FF0000">\1</b>',$tmp);
- // Вернуть обратно строки в кавычках
- if (count($quote_list_text)) {
- $quote_list_text=array_reverse($quote_list_text, true);
- foreach($quote_list_text as $k=>$i) {
- $tmp=str_replace('<text'.$k.'>',
- '<span style="color:#777;">'.$i.'</span>', $tmp);
- }
- }
- // Вернуть обратно экранированные символы
- if (count($quote_list_symbols)) {
- $quote_list_symbols=array_reverse($quote_list_symbols, true);
- foreach($quote_list_symbols as $k=>$i) {
- $tmp=str_replace('<symbol'.$k.'>', $i, $tmp);
- }
- }
- // Вернуть подсвеченный текст запроса
- // Если не надо расставлять переносы, то уберите nl2br
- return nl2br(trim($tmp));
- }
Читать статью целиком »
Просмотров: 4850 | Комментариев: 7