четверг, 29 октября 2009 г.

Продажа контента за SMS

Сейчас очень распространенным стала оплата услуг и товаров через СМС. Но не многие знают как это все организовано.
Я бы хотел рассказать об одном из простых способов.

Рассмотрим пример оплаты и прокомментируем каждый этап исходным кодом на PHP.

0. Размещению на сайте оплаты через смс предшествует заключение договора с компанией предоставляющей эти услуги.
1. Пользователь заходит на страничку, где ему предлагается скачать приложение, предварительно отослав смс с текстом на указанный номер.
Реализация: Выводится статичные текст с текстом и телефоном, который предоставила на предыдущем этапе организация
2. Клиент отправляет СМС. Ему приходит ответная с уникальным кодом на доступ
Реализация: Сервер смс компании, получает сообщение с нужным тектом на номер. Генерируется событие, вызывающее произвольную (настраиваемую) страницу на нашем сайте. На это странице мы произвольны сделать, что угодно.
Генерируем код, и записываем в БД:
function getCOde() {
  $code = sprintf("%06x", rand(1000000, 10000000)); //рандомное число, преобразованное в hex
  //проверяем на повторения
  $res = db_query("SELECT COUNT(*) AS cnt FROM {sms_pay} WHERE code = '%s'", $code);
  $codes = db_fetch_array($res);
  if($codes['cnt'] > 0) {
    getCode(); //генерируем еще раз
  }
  db_query("INSERT INTO {sms_pay} (code) VALUES('%s')", rand(), $code); //записываем код в БД
  return $code;
}
Сгенерированный код, вываливается через echo в браузер, а сервер весь сгенерированый текст отправляет в виде смс обратно клиенту.
На данном этапе код еще не привязан ни к одному материалу и его можно активировать на любом.
3. Клиент получил код, вводит его, чтобы получить доступ к материалу
Реализация: Сервер сайт получает код, проверяет его наличие в БД. Если код верный, то в БД вносятся данные о файле к которому был получен доступ, также для защиты от передачи кода третьим лицам в бд заносится ip адрес клиента и ставится кука.
Файл может быть скачан не сразу, а по частям. В этом случае пользователю дается несколько часов на скачку файла: в бд заносим также время первого обращения к файлу.
После этого пользователю файл стримится прямо в браузер с утановкой необходимых хеадреов, чтобы у клиента не было прямого доступа к файлу (Об этом можно почитать отдельно, я пользуюсь стандартными функциями Drupal)
4. Клиент повторно обращается к этому же файлу.
Реализация: При повторном обращении к файлу, снова проверять код не обязательно. Необходимо сверить лишь куки и ip пользователя, а также id файла к которому идет обращение.
5. Если пользователь пытается обратится к другому файлу с этим же кодом, то это ему не удастся, т.к. он не пройдет проверку по id файла.
6. Код был передан третьим лицам. Пользователь не пройдет проверку по ip и куке.
Примерный код для предыдущих пунктов можно видеть в листинге: (php/Drupal, точка входа функция sms_pay_file_download)

пятница, 2 октября 2009 г.

Что быстрей LEFT JOIN или подзапрос в SELECT

Часто требуется выбрать дополнительные параметры плюсом к основной выборке.
Это можно сделать двумя способами:
  • LEFT JOIN к основному запросу
  • Подзапрос в секции SELECT
Пример запроса, выбирающего номенклатуру и товарную группу номенклатуры:

Подзапрос в секции SELECT:
SELECT nom.Наименование,
(SELECT tg.Наименование FROM Товарная группа tg WHERE tg.ID = nom.Товарная группа)
FROM Номенклатура nom

Вариант с LEFT JOIN:
SELECT nom.Наименование, tg.Наименование
FROM Номенклатура nom
LEFT JOIN Товарная группа tg
 ON(tg.ID = nom.Товарная группа)

После разбора плана выполнения запроса в MS SQL Server, было выявлено:
  • При выборке в секции SELECT требуется дополнительное время на слияние основной выборки и подзапроса. Вышло 1% от общего времени.(+ LEFT JOIN / - SELECT)
  • Оказалось, что каждый LEFT JOIN выполняется отдельным потоком! В то время как подзапросы выполняются последовательно после основной выборки. (+ LEFT JOIN / - SELECT)
  • Каждый LEFT JOIN объединяется в результирующую выборку, что требует дополнительной памяти. В то время как подзапрос вернет нам одно значение на каждую строку, т.е. для получения результата нам нужно меньше памяти. (- LEFT JOIN / + SELECT)
Вывод: В условиях многоядерных серверов LEFT JOIN имеет неоспоримые преимущества

Ограничения в подзапросах:
При выборке дополнительных параметров в секции SELECT мы можем столкнуться с ситуацией, когда подзапрос вернул нам более одной записи. Отсечь это можно, указав принудительно число выбираемых записей:
SELECT nom.Наименование,
(SELECT TOP 1 tg.Наименование FROM Товарная группа tg WHERE tg.ID = nom.Товарная группа)
FROM Номенклатура nom
Такой запрос выполнялся дольше на 96% по сравнению с аналогичным без TOP 1

Разбор плана показал, что 1% дополнительного времени тратится вложенный цикл, а 95% на просмотр определенных строк не кластеризованного индекса!
Из этого можно сделать один вывод: никогда не используйте без надобности ограничения в подзапросах.

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

вторник, 8 сентября 2009 г.

Установка Linux Fedora

Памятка по установке Linux Fedora 
1. Разбиение диска 
Я предпочитаю разбивать диск сам, не доверяя установочным скриптам
Необходимо создать 2 раздела:
  • Linux Swap  - раздел Primary, размер равен двум объемам ОЗУ
  • Linux Ext - раздел Primary, размер достаточный для установки ОС/Программ, не менее 4 Г.
2. Процесс установки
  • Установка с DVD диска
  • - Указываем расположение свапа и основного раздела. Это не составит труда, т.к. диск уже разбит раньше
  • Установка с жесткого диска
  • - Создаем загрузочный диск из папки isolinux
    - Указываем расположение образа диска - Указываем расположение свапа и основного раздела. Это не составит труда, т.к. диск уже разбит раньше
3. Настройка загрузчика GRUB
grub.conf - загрузка винды по умолчанию через 5 секунд:
default=2
timeout=5
splashimage=(hd1,2)/boot/grub/splash.xpm.gz
hiddenmenu
title Fedora 7
 root (hd1,2)
 kernel /boot/vmlinuz-2.6.21-1.3194.fc7 ro root=LABEL=/ rhgb quiet
 initrd /boot/initrd-2.6.21-1.3194.fc7.img
title Windows
 rootnoverify (hd0,0)
 chainloader +1
4. Автомонтирование дисков
fstab - cdrom, fat/ntfs, дискета, usb
LABEL=/                 /                       ext3    defaults        1 1
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/fd0                /mnt/a                  vfat    user,noauto,rw  0 0
/dev/sda5               /mnt/f                  vfat    defaults        0 0
/dev/sdb5               /mnt/d                  ntfs    force,rw        0 0
/dev/sdb1               /mnt/c                  ntfs    force,rw        0 0
/dev/sdc1               /mnt/usb                vfat    user,noauto,rw  0 0
LABEL=SWAP-sda1         swap                    swap    defaults        0 0
5. Установка репозитория
  • Копируете все rpm пакеты с диска/дисков в отдельный катклог.
  • Выполняете команду createrepo /путь/к/катклогу (если такой команды нету ищете на дисках пакет он так и называется createrepo)
    Заходите в /etc/yum.repos.d/ удаляете все файлы(копируете в другое место) и создаёте свой fedoracore.repo следующего содержания:
    [core]
    name=Fedora Core $releasever - $basearch
    baseurl=file:///путь/к/базовым_репозиториям
    enabled=1
    gpgcheck=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora file:///etc/pki/rpm-gpg/RPM-GPG-KE
     
  • Запускаем yum list, и если всё прошло благополучно, радуемся жизни 
6. Установка mc
http://mirror.yandex.ru/fedora/tigro/10/i386/
7. Установка mplayer и кодеков
Ставим репозиторий
rpm -Uvh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm
Ставим из него mplayer, vlc, xmms и т.д.
8. Установка драйверов видео
9. Установка wine
10. Установка другого ПО: Opera, Apache, PHP и т.д.

суббота, 22 августа 2009 г.

Движок воксельной трассировки лучей

Движок виртуализации трехмерной графики на основе трассировки лучей (фотореалистичная графика)
Возможности:
• Визуализация поверхностей второго порядка
• Виртуализация пространства на основе скалярных и аналитических функций возмущения над поверхностями второго порядка.
• Виртуализация пространства на основе трехмерных массивов вокселей
• Освещение сцены точечными, сферическими и коническими источниками света
• Возможность наложения как проективных текстур (из файла), так и программно-генерируемых
• Возможность наложения текстур изменяющих свойства материала и вектора нормали
• Возможность экспорта (растеризации) готовых сцен в популярные форматы (JPG, GIF, PNG, TIFF, TGA)
• Переносимость продукта на популярные платформы (Unix, Windows, Mac, ОС мобильных устройств и т.д.)
• Кластеризация расчетов (Разделение рендера на независимые потоки)
Характеристики: c++, qt, многопоточность, переносимость
Дата разработки: февраль-май 2009

Скачать архив (Размер файла: 2080 КБ)

Конструктор тестов с экпортом

Конструктор тестов/опросов/голосовании с возожностью экспорта на стороние сайты (самих тестов и статистики)
Характеристики: php, mysql, ajax, jsonp, jquery
Дата разработки: март-май 2009

Скачать архив (Размер файла: 59 КБ)

SimplePDO

Класс расширяющий и упрощающий работу с PDO
Синтаксис:
$r = $sp->query("insert into ?_url_alias(src, dst) VALUES(%s, %s)", "tst", "test");
echo $sp->query("update ?_url_alias set dst = %s where pid = %u", "tst1", $r);
print_r($sp->selectCol("{?_url_alias} select * from ?_url_alias"));
print_r($sp->selectRow("{?_url_alias} select * from ?_url_alias where pid = %u and dst = %s", 1, "news"));
print_r($sp->select("select * from ?_url_alias"));
Возможности: плэйсхолдеры, кэширование, перфиксы таблиц, выборка таблиц/строк/ячеек/столбцов
Дата разработки: июль 2008

Скачать архив (Размер файла: 4КБ)

Шаблонизатор SimpleTpl

Простой шаблонизатор.
Пример использования:
Read Template and set Variables
->getTpl(string Tpl [, mixed Variable1 [, mixed Variable2] [, ...]]);
return: String template with replace variables. Exit program, if template not exist
Дата разработки: июль 2008

Скачать архив (Размер файла: 915Б)

Модуль связи PunBB и Drupal

Модуль связи PunBB и Drupal
Только через Drupal. Рекомендую на пунбб вообще отключить регистрацию.
1. Единая регистрация
2. Единая авторизация
3. Единый выход
4. Единая смена учетных данных (В данной версии: почта, временная зона и пароль)
5. Анонс нодов на форуме
Дата разработки: февраль - апрель 2008
Основное место обсуждения

Скачать архив (Размер файла: 8КБ)

WikiMedia

Wiki движок
Особенность от обычного wiki: возможность создания виджетов (программ написанных на внутреннем языке движка (подмножестве PHP)), с целью автоматизации процессов внутри сайта
Основные виджеты: вставка аудио/видео, сжатие картинок, преобразование ссылок (виджеты можно создавать самому)
Характеристики: php/mysql/mod_rewrite
Дата разработки: октябрь-декабрь 2007

Скачать архив (размер файла: 3221КБ, внутри есть полное описание проекта)

PHP-CRAFT

Портальная система для создания сайтов:
Харктеристики: PHP/MYSQL/MOD_REWRITE/модульность/блочность/смена тем/wysiwig
Дата создания: 2004-2006 года

Скачать файл (Размер архива: 1043КБ)