PostgreSQL coub express.js freeware git jquery laravel links linux macos mysql node.js php powershell python ubuntu vim virtualbox анекдот блог игры интересно стихи цитаты

Node.js + MySQL FOUND_ROWS()
February 10, 2014
Столкнулся с багой оригинального характера. Когда написал свою первую прокладку под mysql сильно радовался тому, что все работает и довольно привычно-удобно. Но оказывается я страшный лошара. В этой самой прокладке есть метод foundRows который должен возвращать (и это иногда работает!) количество рядов в запросе без учета LIMIT (см. FOUND_ROWS()). Загвоздка в том что FOUND_ROWS() сработает только для того запроса который был перед ним в пределах одного коннекта. То есть сначала запрос на select с лимитом и следующим обязательно должен быть select found_rows() примерно так
SELECT SQL_CALC_FOUND_ROWS * 
FROM tbl_name
WHERE id > 100 
LIMIT 10;

SELECT FOUND_ROWS();
В ситуации с асинхронными запросами, когда используется только один коннект, при приличной паралельной загрузке между этими двумя запросами вполне может проскочить другой запрос и FOUND_ROWS() начнет "врать". По сути очередь будет выглядеть так
SELECT SQL_CALC_FOUND_ROWS * 
FROM tbl_name
WHERE id > 100 
LIMIT 10;

# пример "проскочившего" запроса
SELECT *
FROM tbl_name_2
WHERE id=12;

SELECT FOUND_ROWS();
И вот уже FOUND_ROWS() возвращает совершенно не то что нужно. Для создания тестовой загрузки проекта можно пользоваться Apache ab например вот так
# 900 раз запросить страницу с 10 конкурентными запросами
ab -c 10 -n 900 http://cocainum.info/post/301/
В моей ситуации во время такого тестирования мелкие запросы как раз влезали между запросами с лимитом и запросами подсчета рядов. В результате пейджинг думал что страниц у него ровно одна штука и исчезал со всех своих страниц как класс, пока шла нагрузка с конкурентными запросами.
А теперь внимание вопрос для третьего класса средней школлы.. Как поделить три яблока на четверых чтобы каждый получил по яблоку и никто не получил по лицу. Как же это решить? Я не нашел удобного толкового решения. Callback hell забарывает и на код становится жутко глядеть. Решение есть, смотрим тут Pooling connections. То есть если необходимо по каким-то причинам строго последовательно выполнять запросы, то из пула специально берем отдельный коннект и пользуемся им. Выглядеть это будет примерно так:
pool.getConnection(function(err, conn) {
  conn.query( 'SELECT SQL_CALC_FOUND_ROWS * FROM tab1 LIMIT 100,10', function(err, rows) {
    conn.query('SELECT FOUND_ROWS() as cnt', function(err, rows){
      // получаем общее кол-во строк
      // ...
      // освобождаем соединение
      conn.release();
    });
  });
});
В прокладке я это реализовал, но пока что выглядит все это жутко, надо либо свыкнуться с этой мыслью, либо придумать что-то лучше. Пока переделанную версию выкладывать смысла нет по-моему.
Стоит обратить внимание на секцию настроек "Pool options" хотя бы чтобы научиться регулировать количество соединений connectionLimit.
Вообще доделать конечно надо ради интереса, но по-хорошему надо переезжать уже на Sequelize или что-то такое.


Зачем нужен Grunt?
February 08, 2014
О том что такое Grunt и зачем он нужен в общих чертах расскажет статья "Grunt для тех, кто считает штуки вроде него странными и сложными".

Бьюсь об заклад, вы наверняка уже что-то слышали про Grunt. Что ж, Grunt — это, по сути, планировщик задач. Grunt может делать все эти задачи за вас. Стоит лишь установить его, что, кстати, не так уж и сложно, и эти операции будут происходить автоматически, так, что вам про них даже не придётся вспоминать.
© frontender.info


Решил открыть тег ссылки, потому что перетягивать все на свете устанешь (да и вообще как-то не комильфо без необходимости по-моему), в закладках браузера потеряется а тут хоть как-то.. в общем это лирика.

Статья "Пишем качественный код на jQuery" освещает очевидно-понятно какие вопросы. К прочтению не то что обязательно, но может быть очень полезно.
Качественный код – это прежде всего быстрые приложения и сайты без лишнего мусора. В конце концов, быстрая отрисовка страниц и улучшенное реагирование принесут вашим пользователям более позитивный опыт взаимодействия.
© frontender.info


Очередной справочник с интересными (и не очень) ссылками.
  • codeacademy - курс для начинающих на знаменитой академии с уклоном в веб-технологии как я понимаю.
  • checkio.org сногсшибательная обучающая "игра". Нужно понимать английский, но оно того стоит. Очень здорово сделано.
  • Learn Python The Hard Way, 3rd Edition книга или даже гайд по обучению. Английский язык. За сравнительно небольшие деньги можно выкупить видеоверсию и книгу в .pdf
  • Пост на хабре (и ещё один, прямо вчерашний) специально посвященный этой же теме, там тоже тонна ссылок + неплохой вступительный текст, спасибо авторам
  • Let's Learn Python - Basics небольшой вводный видеокурс на английском
  • Python Django tutorial видеокурс по Django, относительно свежий, начало в январе 2013
  • Официальный tutorial Гвидо ван Россума
  • Useful python functions интересная заметка



А теперь по порядку что тут такое происходит
  1. Печатаем какую-то строку в режиме insert (i)
  2. Переходим в режим normal (Esc) устанавливаем курсор на нашу строку и делаем так yy7p. То есть просто дублируем строку 7 раз.
  3. Входим в режим визуальный блок Ctrl+q и тянем курсор вниз на все наши строчки. Теперь есть вариант: выбрать ввод после символа под курсором (нажать A), или перед символом (нажать I)
  4. Вводим собственно то, что должно быть напечатано во всех выбранных строках.
  5. Нажимаем Esc
Думаю может быть интересно поиграть с режимом визуального блока.
Немного почитать о нем можно так :h ctrl-q
vim


aghr