понедельник, 19 ноября 2012 г.

Полезный скриптик для Chrome Gestures

В интернете порой попадаются своеобразно сверстанные сайты, в дизайне которых отсутствуют ссылки постраничной навигации вроде "← Назад | Вперед →" и т.п. Однако эти сайты иногда интересны настолько, что я мирюсь с необходимостью постоянно клацать в адресную строку и менять цифру, означающую номер страницы, чтобы попасть туда, куда нужно.
Но рано или поздно это надоедает (а в последнее время я видел немало таких сайтов на tumblr'e) и хочется упростить себе жизнь. Раньше, когда браузером для серфинга у меня был лишь Firefox, я пользовался в таких случаях расширением All-in-One-Gestures, которое имеет функцию "Increment/decrement digit in URL", срабатывающую при выполнении мышью определенного жеста и меняющую последнюю цифру в адресе страницы автоматически.
Теперь же, когда для серфинга я очень часто использую Chrome и соответствующее расширение для жестов — Gestures for Chrome, мне захотелось иметь подобный функционал и в нем. Плагин сам по себе эту функцию не предлагает, однако в нем имеется возможность использовать пользовательские скрипты. Собственно, после того, как я захотел иметь такую штуку, оставалось только придумать удобные жесты и назначить им следующие коды:
m=/(.*\D[0]*)([\d]+)(.*)/g.exec(location.href);if(m)document.location=m[1]+(~~m[2]-1)+m[3];
и
m=/(.*\D[0]*)([\d]+)(.*)/g.exec(location.href);if(m)document.location=m[1]+(~~m[2]+1)+m[3];
Возможно, кому-нибудь такая штука также пригодится.

UPD: кстати, ничто не мешает эти же скрипты использовать в виде обычных букмарклетов - достаточно создать закладки, вместо URL у которых указать вышеприведенные скрипты, только в URL вместо http:// указать протокол javascript:, чтобы получилось
javascript:m=/(.*\D[0]*)([\d]+)(.*)/g.exec(location.href);if(m)document.location=m[1]+(~~m[2]+1)+m[3];

вторник, 13 ноября 2012 г.

Yii: динамическое отключение профилирования заросов

Столкнулся в Yii с проблемами выделения памяти процессам, в которых осуществляется большое (измеряемое десятками тысяч) количество запросов к базе данных.

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

Чтобы побороть это дело, не отключая профайлинг в принципе (например, через конфиги), можно сделать такой финт ушами:

function dummyFunction(){
 //выключаем все используемые логроуты в начале
 foreach(Yii::app()->log->routes as $route){
  $route->enabled = false;
 }

 //цикл, в котором происходят многочисленные обращения к БД.
 foreach(.....){
  ......
 }

 //включаем логроуты обратно
 foreach(Yii::app()->log->routes as $route){
  $route->enabled = true;
 }
}
По идее, можно отключать только те логроуты, что профилируют запросы, но использованное упрощение в моем случае оказалось вполне допустимо.