some image

Не писал две недели :)

Работа

Все это время упорно работал с http://arshaw.com/fullcalendar/

Интегрирую в проект наших клиентов http://usovolunteer.org, немного грустно, что помогаю армии США если честно. Вот музеям, библиотекам и национальным паркам — это всегда пожалуйста. А армейцам чужой страны… не по себе как-то. Ну что поделать, задачи не выбирают, делаю старательно, как своим:)

Если в кратце про fullCalendar, то это самый зрелый и полнофункциональный на сегодняшний день jQuery календарь. Drag and drop эвентов, аякс загрузка-подгрузка всгео чего только можно, поддержка всяких кастомных фишек ( у меня все управление календарем настраиваемое и рендерится через контролы Smarty ), экспорт в гугл календарь, наконец просто огромное количество решенных проблем в гугле по всем возможным запросам. Просто маст хэв всем проектам с каким-либо сложным расписанием, сложно представить сколько бы я писал все что мне понадобилось с нуля.

Вообщем доволен, работать приятно с ним, следующая стадия разработки продлится до конца января по плану.

Параллельно читаю ‘PHP: Objects, Patterns, and Practice‘, книжки по проектированию не читал курса со второго если честно, все как-то больше статейками урывал. А здесь еще и последнее издание с описанием фишек последних в PHP. Честно не знал про позднее статическое связывание, а как раз пришлось в классе-родителе создать экземпляр класса-наследника при реализации server-side календаря. Очень кстати было.

Как дочитаю — будет ревью.

SQL optimization. Join против In и Exists. Что использовать?

Метки: , Работа

«Раньше было проще» — Подумал я, садясь за оптимизацию очередного запроса в SQL management studio. Когда я писал под MySQL, реально все было проще — или работает, или нет. Или тормозит или нет. Explain решал все мои проблемы, больше ничего не требовалось. Сейчас у меня есть мощная среда разработки, отладки и оптимизации запросов и процедур/функций, и все это нагромождение создает по-моему только больше проблем. А все почему? Потому что встроенный оптимизатор запросов — зло. Read More

Умная адаптация под разрешение экрана на fileboard.ru

Метки: , , Работа

Многие знают про мой проект — fileboard.ru. Рассказывать про него не буду. Просто перейдите, зарегистрируйтесь, попробуйте.

Так вот, существовала проблема, до которой долго не доходили руки. Когда пользователь группирует файлы в одном разрешении, а потом открывает, например, на телефоне, в намного меньшем разрешении — все слепляется в кучу. Появляется эта проблема из-за того, что координаты файлов на экране не привязаны к разрешению, а имеют относительные координаты по осям от 0 до 1. Масштабировать текст и превьюшки — плохая идея, т.к. не хочется ограничивать пользователей 24″ мониторов огромными значками в угоду сохранения читаемости на мобильных.

Пример (1366×768):

Read More

Про современных Бондов и Борнов

Обо всем

Только сейчас посмотрел Эволюцию Борна. Фильм классный, но. Но. По совокупности со Скайфолом накипело.

Ну посмотрите, вот это Джеймс Бонд:

И вот это Джеймс Бонд:

А вот это алкоголик, забежавший на съемочную площадку и случайно попавший в кадр:

Нет ну серьезно, у меня у одного при просмотре возникало ощущение, что Крейгу волею Господа дано играть бомжей и наркоманов с оттопыренными ушами, а его для прикола засунули в Бондиану? Черные очки (привет Гриша Лепс) конечно спасают, но все равно не то:

Та же фигня с Борном.

Вот это Джейсон Борн, чувак который не слезал с курса качественной фармы всю жизнь и крушит все на своем пути:

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

И прошу заметить, я не подбирал фотки, это первое что есть в поисковой выдаче картинок.

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

Прогресс

Обо всем

На домашнем компьютере тормозит FIFA а на телефоне летает GTA, мир перевернулся с ног на голову:)

Яндекс.Навигатор сегодня по доброте душевной завел во двор без сквозного проезда, пытаясь обрулить пробки в центре. Для прикола езжу строго как он говорит, действительно время экономится (если конечно в шлагбаум не упираться). Скоро запомню все хитрожопые проезды и буду как ниндзя летать мимо пробок.

IIS течет? Утечка памяти в модуле sqlsrv 2.0

Работа

То, о чем пойдет речь в данном посте, не что иное как огромная, наглая, ужасная подстава от Microsoft. Выпустить драйвер который безвозвратно забирает n байт памяти при каждом SQL запросе — это надо умудриться.

Итак, обо всем по-порядку.

Довольно таки продолжительное время продакшн сервер грешил непонятными скачками памяти. Сразу было понятно что это w3wp.exe ( рабочий процесс IIS для application пула ).

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

Read More

Все о meta теге управления режимами в Internet Explorer

Работа

Еще не встречал статьи на русском, где все бы было понятно разложено про X-UA-Compatible тег применительно к самому замечательному в мире браузеру.

Cуществует мета тег X-UA-Compatible, который в зависимости от переданного значения content заставляет различные версии IE отображать документ в том или ином режиме.

Это крутейшая фича для IE, поскольку иногда бывает так, что все вылизано до блеска в IE7, работает в IE9 а в восьмерке распадается. И тогда мы можем не тратить время на восьмерку, подсунув ей мета тег, и все будут счастливы.

Итак, встречаем:

<meta http-equiv="X-UA-Compatible" content="IE=5">
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7">
<meta http-equiv="X-UA-Compatible" content="IE=7">
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8">
<meta http-equiv="X-UA-Compatible" content="IE=8">
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9">
<meta http-equiv="X-UA-Compatible" content="IE=9">
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE10">
<meta http-equiv="X-UA-Compatible" content="IE=10">
<meta http-equiv="X-UA-Compatible" content="IE=edge">

Значение IE=5 принудительно переводит браузер в Quirks Mode.

Значения IE=7, IE=8, IE=9, IE10 принудительно переводят браузер в режим стандартов соответствующей версии независимо от DOCTYPE документа.

Значения IE=EmulateIE7, «IE=EmulateIE8″, «IE=EmulateIE9″, «IE=EmulateIE10″ заставляют браузер работать как соответствующая версия браузера. Т.е. если мы используем «IE=EmulateIE8″ в IE9, он будет решать какой режим использовать — quirks, ie7 или ie8 самостоятельно в зависимости от DOCTYPE, и только от него.

Значение IE=edge заставляет браузер переходить в последний доступный стандарт независимо от DOCTYPE.

Пример:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7">
</head>
</html>

- будет использован режим IE7 во всех версиях начиная от IE7, но

<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7">
</head>
</html>

- будет использован Quirks Mode во всех версиях IE

Internet Explorer 10

В IE10 стало 2 Quirks Mode: ie5 qurks и обычный. Первый включается тегом
<meta http-equiv=»X-UA-Compatible» content=»IE=5″>, а второй — отсутствием DOCTYPE.
Вот и все хитрости.

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

Про типы DOCTYPE можно почитать здесь: http://htmlbook.ru/html/!doctype

Нюансы работы PHP session.gc_maxlifetime

Работа

… или почему на некоторых хостингах сессии долго не живут.

Использование ini_set(‘session.gc_maxlifetime’, value); в коде приложения отнюдь не гарантирует сессиям долгую жизнь. Устанавливая эту директиву, вы лишь обеспечиваете, что garbage collector, запущенный из вашего приложения будет  удалять во временной папке сессии, ориентируясь на это время.

Если же garbage был запущен из другого скрипта со своими или дефолтными настройками, он будет удалять файлы, естественно, не оглядываясь на параметр из первого абзаца.

Пример. Вы установили в своем main приложении время жизни сессии 7 дней. Garbage, инициированный вашим приложением, заходит и удаляет все файл старше семи дней.

Но тут вы запускаете на этом же сервере скрипт rebuildDatabase.php, у которого этих настроек нет и берутся дефолтные из php.ini: 1 день. И срабатывает GC. В лучшем случае он удалит все сессии, которые должны были жить несколько дней. В худшем — повесит весь сервер если файлов на удаление оказалось очень много.

Так что на хостинге, где на одном сервере крутится много сайтов и администраторы не позаботились о разделении папок сессий, не редки ситуации, когда изменение  session.gc_maxlifetime просто не работает, т.к. кто-то другой поставил его меньше и постоянно выкашивает ваши сессии.

Мораль: используя в своем проекте ini_set(‘session.gc_maxlifetime’, value), всегда меняйте дефолтную папку вызовом ini_set(‘session.save_path’, value). Ну и про глюки garbage collector php не забываем.

Не удаляются файлы сессий PHP

Метки: , , , Работа

Частая проблема — tmp папка web сервера вдруг содержит n миллионов файлов. Скорее всего это файлы сессий. И образовались они там не вдруг, а за пару месяцев/лет.

Диагностируем

Во первых, затруднительно посмотреть, что находится в папке, т.к. ни FAR, ни виндовый проводник (серверы с проблемой были на windows) не хотят такую папку открывать (FAR вылетал забрав 1гб оперативной памяти, где-то на чтении трехмиллионного файла). Как зайти в папку, содержащую много файлов? Переходим в папку в консоле через cd (переходит махом не зависимо от количества файлов) и пишем:

dir /p

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

Исправляем

Что же произошло и почему garbage collector (далее GC) PHP забил на вашу tmp папку и сто лет ее не чистил?

1) Возможно, не правильно заданы параметры php.ini  session.gc_probability и session.gc_divisor. Вероятность запуска GC при каждом запуске скрипта - session.gc_probability / session.gc_divisor. По умолчанию — 1/100. Соответственно, если задать session.gc_probability = 0 GC не запустится никогда. Соответсвующие параметры нужно проверить и в коде приложения.

2) Возможно, вы изменили session.save_path в своем приложении, и теперь она отличается от той, которая в php.ini. В этом случае GC чистить в вашей кастомной папке ничего не будет и вам нужно заботиться об этом самим, т.к. он чистит только папку, которая указана в ini. Цитата из конфигурационного файла:

; NOTE: If you are using the subdirectory option for storing session files
; (see session.save_path above), then garbage collection does *not*
; happen automatically. You will need to do your own garbage
; collection through a shell script, cron entry, or some other method.
; For example, the following script would is the equivalent of
; setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes):
; cd /path/to/sessions; find -cmin +24 | xargs rm

3) Последнее, самое непонятное. Возможно, вы стали жертвой бага - https://bugs.php.net/bug.php?id=55333 Не знаю, правда это или нет, и баг ли это php или криворукость админов, но у меня на двух серверах, где не была изменена папка сессий по умолчанию, и все сохранялось в «C:/Windows/Temp», GC не работал. И это при абсолютной идентичности других настроек с серверами, где папка была изменена и все было ок. Решил проблему просто — сменил папку с дефолтной на свою, чего и вам желаю.

Удаляем

В tmp папке на момент решения проблемы было 4 миллиона файлов. Удалил их просто:

del sess_*

Процесс удаления не слишком нагружает сервер, и было решено просто запустить операцию на сутки. Тихо мирно все старые файлы сессий были выкошены. Обязательно перед удалением меняйте tmp папку сессий, т.к. иначе пользователи вашего ресурса будут все сутки без конца разлогиниваться (в лучщем случае), а в худшем будут толстые дата лосы из-за вашей невнимательности. Сначала смените путь в php.ini, потом удаляйте.

Для Linux серверов есть хорошая статья на хабре: http://habrahabr.ru/post/152193/