Пара новых сервисов

Интернет сервисы 09.08.2009

Написал не так давно пару сервисов, вот решил поделиться ссылками на них, как всегда сервисы делал только для себя, чтобы иметь такие инструменты под рукой. И не претендую на славу и новизну идей!

Sendmail

Первый сервис предоставляет возможность отсылки почты с возможностью указать «от кого» уходит письмо, делал для того чтобы девушка поверила что такое возможно, RFC он как-то не верила...

sendmail

jsConsole

Второй сервис более интересен, он предоставляет возможность тестировать js-код непосредственно в вашем браузере, чтобы не создавать тестовый файлик. Так же есть возможность импортировать в код библиотеку jQuery.

jsconsole2

О предложениях по улучшению — пишите в камменты!

Sphinx. Для чего нужны дельта-индексы и как их готовить?

Базы данных 31.07.2009

sphinx-delta

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

К примеру, мы имеем очень много записей в базе данных, сотни тысяч или несколько миллионов записей, и данные поступают очень часто, нам их необходимо индексировать, однако запускать каждые 5-10 минут индексацию — это слишком трудоемко.

Поэтому мы делаем два индекса:

  • Полный — индексируются все данные целиком (запускаем раз в сутки)
  • Дельта — индексируется только малая часть данных, добавленных в течении дня (запускаем каждые 5-10 минут)

Но как определять с какого момента индексировать данные в дельта-индексе?

Нам необходимо помнить крайний проиндексированный ид-записи из полного-индекса, и начинать индексировать данные только с него, все очень просто :)

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

1
2
3
4
CREATE TABLE `sphinx_delta_counter` (
    `index_name` ENUM( 'pyha_forum' ) NOT NULL,
    `last_post_id` INT UNSIGNED NOT NULL
) ENGINE = InnoDB;

Где,

  • «index_name» — имя индекса, например если у вас много индексов с разных таблиц (можно опустить, если у вас один индекс);
  • «last_post_id» — крайний номер записи для конкретного индекса.

Вставим для нашего индекса запись, чтобы потом можно было обновлять счетчик:

1
2
INSERT INTO `sphinx_delta_counter`
    SET `index_name` = 'pyha_forum', `last_post_id` = 0;

Вы конечно можете этот запрос и в индексе сфинкса использовать, предварительно переписав его на «on duplicate key» и добавив уникальный индекс на связку «index_name+last_post_id», однако я думаю это излишне.

Читать полностью »

Легкая замена стандартного поиска в SMF на Sphinx

Программирование 30.07.2009

smf_sphinx

Потребовалась замена на ПыхоФоруме стандартного поиска на Sphinx, а также сделать нормальный поиск по пользователям. Для этого потребовалось установить Sphinx и движок для MySQL — SphinxSE.

Подготавливаем индекс

Пишем Sphinx-source:

source pyha_forum
{
    type = mysql
    sql_host = localhost
    sql_user = pyha
    sql_pass =
    sql_db = pyha
    sql_port = 3306
    sql_sock = /tmp/mysql.sock

    sql_query_pre = SET NAMES utf8
    sql_query_pre = SET CHARACTER SET utf8

    sql_query = \
        select ID_MSG, concat('user:',posterName) as posterName, subject, body \
        from smf_messages
       
    sql_query_info = select ID_MSG, posterName, subject, body from smf_messages where ID_MSG = $id
    sql_ranged_throttle = 0
}

Поиск по пользователям реализован за счет «concat ('user:',posterName)». И достаточно в поисковую строку ввести «user:adw0rd php», чтобы найти все мои сообщения связанные с php на пыхе.

Читать полностью »

Купил книгу по Python

Python. Изучаем вместе! 30.07.2009

Решил изучить Python, прикупил книженцию «Изучаем Python, 3-е издание». Читается очень легко и захватывающе, сейчас читаю на 100-ой странице, и прям не оторвать от прочтения!

Купил книгу в books.ru на В.О., около метро Василеостро́вская, в бизнес-центре Остров.

Думаю раздел открыть на блоге, посвященный книгам, пока что не открыли проект liburg.ru...

Не возможно использовать для обновления таблицу, в которой производишь выборку

Базы данных 28.07.2009

mysql-logo

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

Вот примеры запросов

Пробуем в лоб:

UPDATE `categories` SET `size` = (`count` / ((max(`count`) - min(`count`)) / 10));
ERROR 1111 (HY000): Invalid USE of GROUP FUNCTION

Попробуем вложенный селект:

UPDATE `categories` SET `size` = (SELECT (`count` / ((max(`count`) - min(`count`)) / 10)) FROM `categories`);
ERROR 1093 (HY000): You can't specify target table 'categories' for update in FROM clause

Попробуем жоин:

UPDATE `categories` AS `c1`
JOIN `categories` AS `c2`
USING(`category_id`)
SET `c1`.`size` = (`c2`.`count` / ((max(`c2`.`count`) - min(`c2`.`count`)) / 10));

ERROR 1111 (HY000): Invalid USE of GROUP FUNCTION

Читать полностью »