Равномерная выборка в MySql

Встала интересная задача — за произвольный срок показать динамику процесса.
Произвольный срок может быть и годом и тремя годами — показатели собираются каждый день, пока процесс установлен на мониторинг показателей. То есть даты могут идти не по-порядку, процесс может быть снят с мониторинга несколько месяцев, потом снова возвращен. Загружать на график все значения за период не просто бессмысленно, но и вредно, и загрузку страницы это замедлит и браузер сделает менее отзывчивым.
Поэтому надо выбрать порядка, скажем, 30 значений: этого будет достаточно, чтобы судить об общей динамике за выбранный период и выглядеть на графике будет это замечательно и нагрузка на браузер нулевая.
Самая главная сложность — это сделать равномерную выборку среди значений которые идут не по-порядку по дате, по ИД и подавно не по-порядку.
Для начала: как понять, что среди значений отсортированных предварительно по возрастанию даты понять, что это именно каждое N/30 значение?
Первое, что приходит в голову — это остаток от деления порядкового номера на N/30. Допустим, значений у нас 100.
Если отбирать записи, у которых порядковый номер делится на 3, получится набор из 33 записей, это как-бы нормально.
Хуже если записей 45, тогда, если округлить делитель до 2 получим 22 результата в наборе, если в меньшую сторону — до одного — то аж 45. Нехилый такой разброс.
Значит, чтобы всегда получать 30 записей в результирующем наборе, надо учитывать значение N/30 хотя бы до одного знака после запятой.
Берем, умножаем на 10 результат деления N/30, умножаем на 10 порядковый номер и остаток от целочисленного деления номера на коэффициент должен быть не точно нулем, а меньше 10.
Пример получившегося кода для MySql:

# Получаем количество записей 
SELECT COUNT(*) AS `N` 
FROM `table` 
WHERE `date` BETWEEN :dateFrom AND :dateTo ;
# koef = N / 30 * 10
# Задаем начальное значение счетчика записей
SET @numRow = 0;
# Делаем выборку
SELECT *, (@numRow := @numRow + 10) as `numRow`
FROM `table`
WHERE @numRow % :koef < 10 
    AND `date` BETWEEN :dateFrom AND :dateTo
ORDER BY `date`

A non well formed numeric value encountered

Это значит, что  в функции date ты пытаешься использовать время в формате, отличном от timestamp, необходимо проверить, что содержит второй параметр, передаваемый в функцию. Скорее всего дата в формате Y-m-d и будет достаточно применить strtotime.

Как сделать форвард в laravel

logo-headПри необходимости показать форму авторизации на вашем сайте без редиректов, чтобы не заморачиваться над тем, как бы не забыть вернуть человека в итоге на нужную ему страницу. Самый простой способ — это сделать forward на нужный метод контроллера авторизации, чтобы пока не авторизован, работал метод авторизации, а как только успешно зашел на сайт, форвард перестает срабатывать, начинает отображаться нужная нам страница и мы все это время остаемся на запрошенном изначально урле.

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

Сначала мы создаем экземпляр запроса, причем от simfony, Request::create(url, method), можно еще передать GET или POST переменные, задать куки, передать файлы и много еще всякой ненужной пурги. Потом этот экземпляр отдаем методу Route::dispatch, который создает экземпляр Response по переданному ему Request, после чего «лишь» остается вернуть содержимое страницы, вызвав метод getOriginalContent. Почему мы получаем пустую страницу и ошибку «Веб-страница недоступна», если вернуть просто полученный  экземпляр Response, лично для меня загадочнейшая загадка. В итоге код форварда будет выглядеть так:

return Route::dispatch(Request::create('login', 'GET'))->getOriginalContent();

Как умудряются работать в phpStorm?

phpstormЭто какой-то капец, всего два дня и я на нее устаю плеваться, какая версия бы не вышла: 4, 5, 6, 7, 7.2, 7.3.
До этого всегда вылезала одна проблема — после какого-то очередного сохранения мышкой курсор устанавливался в одно место, а печатал я совершенно в другом, не там, где мигал курсор — это был взрыв мозга! После пары таких случаев и перезагрузки программы, после которой на короткое время становилось лучше, я эту хрень сносил к ебеням и продолжал пользоваться NetBeans.
Тут вышла phpstorm 8.0 — решил я попробовать: система у меня свежеустановленная, ну может, думаю, на этот раз пойму прелести этой разрекламированной повсюду IDE. Ан нет, на второй день работа в ней сделалась невозможной.
Напечатал < ?php и не смог напечатать обыкновенный пробел, что угодно нажимай — печатает, а пробел — нет.
Стираешь — эта сволочь отказалась печатать > после знака вопроса.
Короче я решительно отказываюсь понимать, с какого вообще черта эта недоIDE вообще популярная и платная.
Снес эту пакость к снова хренам и пjльзуюсь дальше NetBeans. Пусть нет у нее пары плюшек шторма, но работает она без глюков. С этим же штормом я бывало не знал что делать, при отмене-возврате действий и попытке стереть-напечатать файл корежило все больше и было совершенно непонятно: если тупо убить процесс — можно ли будет восстановить открытые файлы или надо будет все печатать заново. К моей радости обычно все оказывалось чуть менее, чем кошмарно, портилось, но с возможностью восстановления в разумные сроки.
Так что следующая версия, которую я попробую — будет 9, и то, предварительно все забэкапив на независимом сервере.

Uncaught exception ‘Exception’

И это в конструкции вида

try {
	throw new Exception();
} catch (Exception $e) {

}

Так вышло из-за действия namespace, в catch скрипт пытается отловить исключение класса \ТекущийNamespace\Exception невзирая на то, что такого класса не существует в природе, проверка на него все-таки производится.
И при выбросе стандартного исключения и при его отлове лучше всегда явно указывать нужное namespace.

try {
	throw new \Exception();
} catch (\Exception $e) {

}

Школьные учебники

x_63e83de0Я подозреваю — что написание школьных учебников — офигительно прибыльный бизнес. Судя по содержимому современных учебников — можно быть не особо грамотным, можно не перечитывать, что ты там насоставлял, не проверять — решаются ли задачи, не париться, реально ли вообще по этому учебнику будет учиться.

Быть настолько идиотом, что составить учебник из одних задач и заданий, не включив перед заданиями теории в нужном объеме, не привести ни одного правила в учебнике по русскому языку.

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

Еще и цена как на новинки самых продаваемых авторов.

Fatal error: Call to a member function getMessage() on a non-object in modmanagercontroller.class.php on line 557

MODX такое выдал в логи при переносе на другой хостинг. А в браузере белый экран.

Дело в том, что  файле настроек ./core/config/config.inc.php все пути абсолютные. Поэтому надо их все переписать на правильные. Абсолютный путь к сайту хранится в переменной $modx_base_path.

В моем случае — $modx_base_path= ‘/home/username/site.ru/public_html/’;

Берем эту строку вместе с первой кавычкой до последнего слеша (пледний слеш остается) — ‘/home/username/site.ru/public_html и меняем ее по всему документу на dirname(__FILE__).’/../..

modx 557

Установка Windows 7 на Acer Aspire V5 571

gpt diskРодственники купили компьютер с предустановленной Windows 8. Которая пока еще никому не показалась удобнее семерки как из искушенных так и неискушенных людей среди моих знакомых. Попытались установить семерку сами, но очень скоро сдались и попросили переустановить.

acer driversДля начала смотрим, не будет ли проблем с поиском драйверов по семерку. С этим все нормально — на сайте производителя драйвера как на семерку так и на восьмерку.

Вставляем диск дистрибутивом, во время загрузки пытаемся давить F8. Что-то не помогает.
Придется смотреть биос. Ctrl+Alt+Del и F2 в начале загрузки.
Boot priority предпоследним пунктом в верхнем меню. В пояснениях справа пишут, что можно менять приоритет устройств для загрузки. Выбираем DVD и нажатием F6 подымаем его на первое место.
Пробуем перезагрузиться.. снова не помогло… грузится восьмерка.
Помнится: при тасовке устройств первым пунктом было что-то связанное с незнакомым мне сокращением UEFI. Возвращаемся в биос, ага.. есть возможность вместо этого UEFI выбрать instant boot. Пробуем выбрать его, сохраняем и выходим. Ура! Пошла загрузка.

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

Пробуем выбрать самый большой раздел — фиг! Установка на данный диск невозможна. Выбранный диск имеют стиль разделов GPT.
Ну да и фиг с ним, не нравится стиль разделов, значит будем сносить. Служебные разделы нафиг не нужны, драйверы у нас все есть. Сомневаться не в моих правилах. Есть ощущение, что прокатит — надо делать как думаю. Пойдет что-то вдруг не так — тогда и будем разбираться детальнее. Интернет и рабочий компьютер под рукой,  так что неразрешимых проблем не будет.

edit diskВыбираем «Настройка диска» — последовательно выделяем диски, начиная с последнего и нажимаем каждый раз «удалить».
После чего осталась одна неразмеченная область на 1 терабайт. Нажимаем создать и редактируем размер — задаем примерно 200 гигабайт (не люблю когда все в куче на одном диске, предпочитаю на диске с системой держать непосредственно систему и программы, которые требуют установки, чтобы в случае переустановки системы просто отформатировать один диск и поставить на чистый диск все заново).
Выбираем снова оставшуюся неразмеченную область и создаем еще один раздел, на этот раз на все оставшееся пространство.

Выбираем последовательно оба диска и нажимаем «форматировать». Выбираем диск 200 ГБ — кнопка «Далее» на этот раз активна — предупреждающая надпись на этот раз пропала — нажимаем «далее» — и ждем пока установится.

Осталось только установить все драйвера. Есть смысл сначала установить драйвер IntelChipset Driver, затем IntelVGA Driver, перезагрузить компьютер и затем уже устанавливать все остальное. VGA драйвера нужны все три, т.к. видеокарточки в буке две, одна работает на повседневных задачах, которая intel hd graphics, а nvidia стоит активировать только для требовательных к графике задач — в играх и графических редакторах. Я предпочитаю также активировать ее и в браузере тоже, иначе случаются тормоза, особенно заметно на флеше.

Column doesn’t belong to any of the selected models

Phalcon\Mvc\Model\Exception: Column ‘XXXX’ doesn’t belong to any of the selected models (1)
Вдруг кому пригодится — вы ошиблись с указанием названия столбца при передаче $parameters для одного из методов модели, ошиблись с рЕгистром символов, пропустили букву или наоборот — лишних символов добавили.

Main Layout в мультимодульном приложении phalconphp

C одномодульным приложением все просто, Action View — app/views/controller/, Main Layout — app/views/index.phtml.
С мультимодульным возникает проблема с использованием общего Main Layout для всего приложения. как решить?