С Днем Победы!
Blog. Just Blog

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

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

Ошибка MySQL "Got error 28 from storage engine"

20.05.2010 | Категория: Web-мастеру и не только | Автор: ManHunter
Прихожу на работу, а у меня уже телефон разрывается от звонков. Рабочий сайт компании лежит с загадочной ошибкой MySQL "Got error 28 from storage engine", причем не весь, а выборочно местами и только на некоторых запросах. В официальной документации по MySQL ничего внятного не нашел, но после небольшого расследования и поиска в разных интернетах выяснилось, что такая ошибка возникает из-за нехватки свободного места на диске. На небольших запросах оставшегося места хватало для работы MySQL и возвращался какой-то результат, а на более ресурсоемких появлялась указанная ошибка. Позвонил админам, добавили места, почистили мусор, проблема сразу же решилась. Вот такая загогулина. Может кому-нибудь пригодится.

Просмотров: 13519 | Комментариев: 11

Определение мобильных браузеров на PHP

30.04.2010 | Категория: Web-мастеру и не только | Автор: ManHunter
С быстрым развитием рынка мобильных устройств становится актуальной тема создания сайтов для них. Это могут быть самостоятельные страницы сайтов, или же просто облегченные версии страниц с минимумом графики, особыми стилями, версткой, чтобы сайт можно было комфортно просматривать на маленьком экранчике мобильного телефона или КПК. И лучше делать это автоматически, не заставляя пользователя искать на основном сайте какие-то дополнительные ссылки. Например, если вы откроете с мобильного телефона любую страницу моего сайта, то вас автоматически переадресует на облегченную версию этой же страницы для мобильных устройств. Определять браузер средствами PHP мы уже умеем, главная сложность - выделить сигнатуры браузеров мобильных устройств. К счастью, это уже сделано на сайте Detect Mobile Browsers. Весь сайт целиком посвящен только одному скрипту для определения мобильных браузеров, но сам скрипт обвешан ненужными наворотами и написан каким-то жутким стилем, так что в исходном виде практически бесполезен. А вот позаимствовать из него сигнатуры и некоторые другие методы определения вполне можно, что и было сделано. Код полностью вычищен и оптимизирован.
  1. //--------------------------------------------------------------------
  2. // Функция проверки принадлежит ли браузер к мобильным устройствам
  3. // Возвращает 0 - браузер стационарный или определить его не удалось
  4. //            1-4 - браузер запущен на мобильном устройстве
  5. //--------------------------------------------------------------------
  6. function is_mobile() {
  7.   $user_agent=strtolower(getenv('HTTP_USER_AGENT'));
  8.   $accept=strtolower(getenv('HTTP_ACCEPT'));
  9.  
  10.   if ((strpos($accept,'text/vnd.wap.wml')!==false) ||
  11.       (strpos($accept,'application/vnd.wap.xhtml+xml')!==false)) {
  12.     return 1// Мобильный браузер обнаружен по HTTP-заголовкам
  13.   }
  14.  
  15.   if (isset($_SERVER['HTTP_X_WAP_PROFILE']) ||
  16.       isset($_SERVER['HTTP_PROFILE'])) {
  17.     return 2// Мобильный браузер обнаружен по установкам сервера
  18.   }
  19.  
  20.   if (preg_match('/(mini 9.5|vx1000|lge |m800|e860|u940|ux840|compal|'.
  21.     'wireless| mobi|ahong|lg380|lgku|lgu900|lg210|lg47|lg920|lg840|'.
  22.     'lg370|sam-r|mg50|s55|g83|t66|vx400|mk99|d615|d763|el370|sl900|'.
  23.     'mp500|samu3|samu4|vx10|xda_|samu5|samu6|samu7|samu9|a615|b832|'.
  24.     'm881|s920|n210|s700|c-810|_h797|mob-x|sk16d|848b|mowser|s580|'.
  25.     'r800|471x|v120|rim8|c500foma:|160x|x160|480x|x640|t503|w839|'.
  26.     'i250|sprint|w398samr810|m5252|c7100|mt126|x225|s5330|s820|'.
  27.     'htil-g1|fly v71|s302|-x113|novarra|k610i|-three|8325rc|8352rc|'.
  28.     'sanyo|vx54|c888|nx250|n120|mtk |c5588|s710|t880|c5005|i;458x|'.
  29.     'p404i|s210|c5100|teleca|s940|c500|s590|foma|samsu|vx8|vx9|a1000|'.
  30.     '_mms|myx|a700|gu1100|bc831|e300|ems100|me701|me702m-three|sd588|'.
  31.     's800|8325rc|ac831|mw200|brew |d88|htc\/|htc_touch|355x|m50|km100|'.
  32.     'd736|p-9521|telco|sl74|ktouch|m4u\/|me702|8325rc|kddi|phone|lg |'.
  33.     'sonyericsson|samsung|240x|x320vx10|nokia|sony cmd|motorola|'.
  34.     'up.browser|up.link|mmp|symbian|smartphone|midp|wap|vodafone|o2|'.
  35.     'pocket|kindle|mobile|psp|treo|android|iphone|ipod|webos|wp7|wp8|'.
  36.     'fennec|blackberry|htc_|opera m|windowsphone)/'$user_agent)) {
  37.     return 3// Мобильный браузер обнаружен по сигнатуре User Agent
  38.   }
  39.  
  40.   if (in_array(substr($user_agent,0,4),
  41.     Array("1207""3gso""4thp""501i""502i""503i""504i""505i""506i",
  42.           "6310""6590""770s""802s""a wa""abac""acer""acoo""acs-",
  43.           "aiko""airn""alav""alca""alco""amoi""anex""anny""anyw",
  44.           "aptu""arch""argo""aste""asus""attw""au-m""audi""aur ",
  45.           "aus ""avan""beck""bell""benq""bilb""bird""blac""blaz",
  46.           "brew""brvw""bumb""bw-n""bw-u""c55/""capi""ccwa""cdm-",
  47.           "cell""chtm""cldc""cmd-""cond""craw""dait""dall""dang",
  48.           "dbte""dc-s""devi""dica""dmob""doco""dopo""ds-d""ds12",
  49.           "el49""elai""eml2""emul""eric""erk0""esl8""ez40""ez60",
  50.           "ez70""ezos""ezwa""ezze""fake""fetc""fly-""fly_""g-mo",
  51.           "g1 u""g560""gene""gf-5""go.w""good""grad""grun""haie",
  52.           "hcit""hd-m""hd-p""hd-t""hei-""hiba""hipt""hita""hp i",
  53.           "hpip""hs-c""htc ""htc-""htc_""htca""htcg""htcp""htcs",
  54.           "htct""http""huaw""hutc""i-20""i-go""i-ma""i230""iac",
  55.           "iac-""iac/""ibro""idea""ig01""ikom""im1k""inno""ipaq",
  56.           "iris""jata""java""jbro""jemu""jigs""kddi""keji""kgt",
  57.           "kgt/""klon""kpt ""kwc-""kyoc""kyok""leno""lexi""lg g",
  58.           "lg-a""lg-b""lg-c""lg-d""lg-f""lg-g""lg-k""lg-l""lg-m",
  59.           "lg-o""lg-p""lg-s""lg-t""lg-u""lg-w""lg/k""lg/l""lg/u",
  60.           "lg50""lg54""lge-""lge/""libw""lynx""m-cr""m1-w""m3ga",
  61.           "m50/""mate""maui""maxo""mc01""mc21""mcca""medi""merc",
  62.           "meri""midp""mio8""mioa""mits""mmef""mo01""mo02""mobi",
  63.           "mode""modo""mot ""mot-""moto""motv""mozz""mt50""mtp1",
  64.           "mtv ""mwbp""mywa""n100""n101""n102""n202""n203""n300",
  65.           "n302""n500""n502""n505""n700""n701""n710""nec-""nem-",
  66.           "neon""netf""newg""newt""nok6""noki""nzph""o2 x""o2-x",
  67.           "o2im""opti""opwv""oran""owg1""p800""palm""pana""pand",
  68.           "pant""pdxg""pg-1""pg-2""pg-3""pg-6""pg-8""pg-c""pg13",
  69.           "phil""pire""play""pluc""pn-2""pock""port""pose""prox",
  70.           "psio""pt-g""qa-a""qc-2""qc-3""qc-5""qc-7""qc07""qc12",
  71.           "qc21""qc32""qc60""qci-""qtek""qwap""r380""r600""raks",
  72.           "rim9""rove""rozo""s55/""sage""sama""samm""sams""sany",
  73.           "sava""sc01""sch-""scoo""scp-""sdk/""se47""sec-""sec0",
  74.           "sec1""semc""send""seri""sgh-""shar""sie-""siem""sk-0",
  75.           "sl45""slid""smal""smar""smb3""smit""smt5""soft""sony",
  76.           "sp01""sph-""spv ""spv-""sy01""symb""t-mo""t218""t250",
  77.           "t600""t610""t618""tagt""talk""tcl-""tdg-""teli""telm",
  78.           "tim-""topl""tosh""treo""ts70""tsm-""tsm3""tsm5""tx-9",
  79.           "up.b""upg1""upsi""utst""v400""v750""veri""virg""vite",
  80.           "vk-v""vk40""vk50""vk52""vk53""vm40""voda""vulc""vx52",
  81.           "vx53""vx60""vx61""vx70""vx80""vx81""vx83""vx85""vx98",
  82.           "w3c ""w3c-""wap-""wapa""wapi""wapj""wapm""wapp""wapr",
  83.           "waps""wapt""wapu""wapv""wapy""webc""whit""wig ""winc",
  84.           "winw""wmlb""wonu""x700""xda-""xda2""xdag""yas-""your",
  85.           "zeto""zte-"))) {
  86.     return 4// Мобильный браузер обнаружен по сигнатуре User Agent
  87.   }
  88.  
  89.   return false// Мобильный браузер не обнаружен
  90. }
Функция возвращает false, если браузер стационарный или по каким-то причинам его не удалось определить. Если браузер запущен на мобильном устройстве, то результат будет от 1 до 4, это код метода, которым он был определен. Сигнатуры на сайте время от времени пополняются, так что можете брать их оттуда самостоятельно и дополнять эту функцию.

Просмотров: 33037 | Комментариев: 14

Поле ввода с убирающейся подсказкой

20.04.2010 | Категория: Web-мастеру и не только | Автор: ManHunter
Трудно представить современный сайт без интерактивности. И она состоит из множества мелких деталей, которые стали уже чуть ли не стандартом в web-строительстве. Одна из таких "фишек" - текстовое поле ввода, в котором по умолчанию прописана подсказка об ожидаемом содержимом, например, "введите текст для поиска". При клике на это поле текст подсказки убирается, а при уходе с него, если пользователь ничего не ввел, текст подсказки возвращается обратно. Такой способ экономит полезное место в дизайне, не загромождая его выносными подсказками, а также помогает пользователю лучше ориентироваться при заполнении различных форм. Классический вариант, который обычно используется на сайтах, выглядит примерно так:
  1. <label for="search">Поиск по сайту:</label>
  2. <input type="text" name="search" id="search" value="что ищем?"
  3.        onfocus="if(this.value==this.defaultValue){this.value='';}"
  4.        onblur="if(this.value==''){this.value=this.defaultValue;}">
Могут быть некоторые варианты в реализации, но основной принцип остается этот же. Алгоритм простейший: при получении фокуса полем ввода проверяется его содержимое. Если оно совпадает со значением, установленным в параметре value, то содержимое подменяется на пустую строку. При потере фокуса также выполняется обратная проверка, и если поле осталось пустым, то в него подставляется значение по умолчанию. Плюсы этого способа: минимальный код, работает с отключенными стилями, хорошая совместимость с различными браузерами. Но минусы тоже значительные: при отключенных скриптах поле ввода придется сперва вручную очистить, а затем уже вписать в него нужное значение, для смены оформления подсказки придется писать дополнительный код, при отправке формы без дополнительных проверок будет передано значение по умолчанию и в любом случае потребуется дополнительная обработка введенных данных на стороне сервера, особые поля типа пароля будут отображать звездочки вместо текста подсказки.

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

Методы parseInt и parseFloat: особенности и альтернативы

28.03.2010 | Категория: Web-мастеру и не только | Автор: ManHunter
Для преобразования строки в число в JavaScript используются два метода: parseInt - для целых чисел и parseFloat для чисел с плавающей запятой. В официальной документации про parseInt сказано примерно следующее:


Метод parseInt возвращает целое значение, равное числу, содержащемуся в его параметре. Если параметр не может быть обработан как целое, возвращается NaN.


И почти то же самое про parseFloat:


Метод parseFloat возвращает числовое значение, содержащееся в его параметре. Если параметр не может быть обработан как число с плавающей точкой, возвращается значение NaN.


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

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

Сервис аккредитации PHP-разработчиков

28.02.2010 | Категория: Web-мастеру и не только | Автор: ManHunter
Чуть больше года назад натолкнулся на интересный сайт для web-программистов inPHP.org. Вот что пишут про него сами его создатели:


Сервис inPHP.org представляет собой удобный, надежный и высокотехнологичный инструмент, полезный как для IT-разработчиков, так и для работодателей. В основе проекта заложена идея обеспечения подтверждения компетенции программистов в реальном времени для любого пользователя сети интернет. Общий диапазон уровня навыков PHP-разработки, в рамках системы, условно разбит на 8 уровней (где 1-й уровень - самый простой, а 8-й наиболее сложный). Кроме того, существуют специализированные уровни, призванные охарактеризовать узкие профессиональные качества разработчика. Любой зарегистрированный участник имеет возможность, последовательно проходя тесты семи уровней, подтвердить собственную квалификацию и передать ссылку на персональную страницу в системе заинтересованным лицам (заказчикам, работодателям). Более того, после достижения седьмого уровня, участник получает возможность пройти аккредитацию сотрудником сервиса на высший уровень компетенции. Лица, заинтересованные во взаимовыгодном сотрудничестве с профессиональными PHP-разработчиками, в свою очередь, получают возможность подтверждения профессиональной пригодности того или иного кандидата просто изучив его персональную страницу в сервисе.


Смысл аккредитации в том, что надо пройти несколько бесплатных тестов по 10 вопросов в каждом, все тесты с возрастающей сложностью и разной тематикой. Если дан хоть один неправильный ответ, то повторная пересдача разрешена только через три часа. Кроме бесплатных тестов есть три дополнительных теста для специализированных аккредитаций, доступ к которым дается после оплаты (по 10 баксов за каждый), но это исключительно по желанию. Недавно в закладках снова наткнулся этот сайт, а там, оказывается, добавился новый 7-й уровень тестирования. Теперь я тоже в тридцатке хайлевелов на этом сайте :)

Просмотров: 3646 | Комментариев: 6

prev 01 ... 25 26 27 28 29 30 31 ... 35 next
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2021
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.1 сек. / MySQL: 2 (0.0021 сек.) / Память: 4.75 Mb
Наверх