Библиотека классов для работы со службой «API Яндекс.Фотки» / PHP / Хабрахабр

Библиотека классов для работы со службой «API Яндекс.Фотки»

Библиотека позволит вам использовать службу «API Яндекс.Фотки» в проектах, написанных на PHP и охватывает все возможности, которые на данный момент предоставляет API.
Страничка, которая посвящена работе библиотеки: code.websaints.net/

Используя эту библиотеку вы можете:

  • Организовать фотогалерею или систему фотогалерей на сайте
  • Управлять галереей, включая загрузку и удаление фотографий, создание и удаление альбомов, а так же управление метаданными

Сервис «Яндекс.Фотки» стоит использовать, так как:
  • Вы не тратите место на хранение изображений на сервере вашего проекта
  • Для работы галереи вам не требуется использование базы данных или другого инструмента, для хранения метаданных и управления ими
  • Служба создает картинки предпросмотра шириной 800,500,300,150,100,75 и 50px и вам не нужно делать это самому.
  • Высока вероятность того, что сервера Яндекс, на которых будут храниться материалы, более надежны, чем у вашего хостинг провайдера
  • Высока вероятность того, что скорость загрузки фотографий пользователем будет выше, чем при загрузке их с вашего сервера

Под катом вы найдете пример работы и его код, снабженный краткими комментариями.

Пример


Галерея любимых фотографий Владислава Мамонтовича

Сразу оговорюсь:
— Нет, вы не сможете создать хостинг изображений на основе этого сервиса, так как это будет нарушать п. 1.2.4. пользовательского соглашения службы «API Яндекс.Фотки». Пример выбран именно таким из соображений наглядности и является… не совсем корректным. Я надеюсь, что сотрудники Яндекса отнесутся к нему снисходительно. Или, по крайней мере, предупредят, прежде чем блокировать несчастного Владислава Мамонтовича.

Пример состоит из 2х файлов:

  1. example.html — отображение галереи
  2. upload_image.html — загрузка изображений

Я не буду акцентировать внимание ни на чем, кроме кода, где непосредственно идет работа с Яндекс.Фотки. Если возникнут вопросы, связанные с каким то кодом — задайте их в комментариях. Я обязательно отвечу.

example.html


Какие ключевые возможности должна реализовать эта страница:
  • Показать список из 25 последних загруженных Мамонтовичем изображений
  • Если нам передан идентификатор загруженного изображения, вывести список ссыллок на созданные службой Яндекс.Фотки картинки предпросмотра и оригинал изображения
  • Вывести форму загрузки изображений, что бы Владислав Мамонтович мог пополнять свою галерею

1. Создадим пользователя от имени которого будем работать с сервисом. А именно — Владислава Мамонтовича.

  1. $photo = new yandex_fotki("MojoElephant");

2. Получим общую коллекцию фотографий Мамонтовича

  1. $photo->user()->add_photo_collection("Слонофотки");

3. Получим последние 25 загруженных Мамонтовичем фотографий

  1. $photo->user()->photo_collection("Слонофотки")->se(array("limit"=>25));

4. Перебрав их все сформируем галерею

  1. foreach($photo->user()->photo_collection("Слонофотки")->photo_list() as $index=>$photo_element){
  2. $photo_block = new template_class("Фото","../../templates/photo.html");
  3. $photo_block->point("Точки ввода");
  4. $photo_block->plug("Точки ввода","Увеличенное","Увеличенное",$photo_element->get_L());
  5. $photo_block->plug("Точки ввода","Предпросмотр","Предпросмотр",$photo_element->get_XXS());
  6. $gallery->plug("Точки ввода","Фотография",$index,$photo_block->render());
  7. }

5. Если Мамонтович загрузил фотографию, то в скрипт был передан идентификатор новой фотографии. Получаем свежезагруженную фотографию по ее id

  1. $new_photo = $photo->user()->photo_collection("Слонофотки")->get_photo_by_id($photo_id);

6. Выводим список ссылок

  1. $link_block = new template_class("Ссылки","../../templates/link_block.html");
  2. $link_block->point("Точки ввода");
  3. $link_block->plug("Точки ввода","Оригинальная","Ссылка",$new_photo->get_orig());
  4. $link_block->plug("Точки ввода","XL","Ссылка",$new_photo->get_XL());
  5. $link_block->plug("Точки ввода","L","Ссылка",$new_photo->get_L());
  6. $link_block->plug("Точки ввода","M","Ссылка",$new_photo->get_M());
  7. $link_block->plug("Точки ввода","S","Ссылка",$new_photo->get_S());
  8. $link_block->plug("Точки ввода","XS","Ссылка",$new_photo->get_XS());
  9. $link_block->plug("Точки ввода","XXS","Ссылка",$new_photo->get_XXS());
  10. $link_block->plug("Точки ввода","XXXS","Ссылка",$new_photo->get_XXXS());

upload_image.html


Какие ключевые возможности должна реализовать эта страница:
  • Сохранить присланное изображение на сервисе Яндекс.Фотки
  • Сообщить example.html идентификатор загруженного на сервер изображения

1. Так как загрузка фотографий возможна только для аутентифицированного пользователя, то мы создаем объект класса yandex_fotki и аутентифицируемся.

  1. $photo = new yandex_fotki("MojoElephant","пароль");

2. После этого надо получить коллекцию фотографий, в которую мы добавим новую фотографию Мамонтовича.

  1. $photo->user()->add_photo_collection("Слонофотки");

3. И, собственно, загрузим фотографию на Яндекс.Фотки. После загрузки мы получим идентификатор фотографии.

  1. $new_photo = array(
  2. "path"=>"../../uploaded/".$_FILES["photo"]["name"]
  3. );
  4. $result = $photo->user()->photo_collection("Слонофотки")->up($new_photo);

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

5. Направляем Мамонтовича на example.html, где он получит ссылки на загруженную фотографию и увидеть ее в галерее.

Заключение


Как видите, все предельно просто и приятно.
Используя минимум усилий вы можете внедрить галерею на сайт.
Единственный минус хранения фотографий на Яндекс.Фотки заключается в том, что на запросы метаданных у службы уходит больше времени, чем при хранении их на вашем сервисе. Но разумное использование кэширования практически сводит его на нет.

Материалы для дополнительного изучения

Спасибо


Огромное спасибо ar2r и nickmitin за помощь с портированием алгоритма шифрования, proto за разьяснения по поводу проекта API Яндекс.Фотки, комментарии и всем всем всем за уделенное мне время. И не менее большое спасибо тем людям с канала #php RusNet, которые дали моей работе экспертную оценку и посоветовали, что можно сделать лучше. mz, avz, focusshifter и всем остальным. Спасибо вам.

Код подсвечен highlight.hohli.com/ который придумал antonshevchuk

Что дальше?


Дальше будет поиск и исправление ошибок, рефакторинг кода, написание более подробных статей о использовании библиотеки и идеологии работы Яндек.Фоток, возможно, создание плагинов для нескольких CMS. Да, собственно, все, что будет нужно и интересно мне и вам.
Но для того что бы дальше было хоть что то мне нужно знать, что моя работа кому то нужна. Если вам библиотека может быть полезна — напишите об этом. Не молчите.

P.S. Если вам понравилась библиотека и вы думаете об участии DEVCONF — проголосуйте за мой доклад на сайте конференции: www.devconf.ru/phpconf/offers

Современные реалии Яндекса или правильный robots.txt

В связи с последними событиями (как-будто, новый АГС придумали, но циферки просто кончились – реальные АГС – только АГС-17 и АГС-30), а именно новой волной выпадания сайтов из индекса Яндекса, хочу поделиться правильными (на мой взгляд :) ) файлами robots.txt для DLE и Wordpress.

правильный robots.txt

Если раньше robots.txt я использовал, в основном, только для указания дерективы hosts (чуть позже, когда наклепал много сайтов на ДЛЕ, начал ещё раздел user закрывать от индексации, так как много спам ссылок в профилях было), то теперь, волей-неволей, приходиться работать с этим файлом более плотно, во избежании вылета сайта из индекса.

Не в тему: решил проверить, как правильно писать волей-неволей, задал всезнающему Яндексу такой запрос, и на  четвертой и пятой позиции оказалось видео. Первый раз такое увидел, удивился даже :) .
волей-не волей

Теперь же ситуация изменилась в корне – сейчас необходимо на новом (относильно новом) сайте закрыть все дубли контента от индексации. Дубли контента появляются в следующих случаях:

  • Использование тегов (меток) на сайте
  • Использование календаря, архивов материалов
  • В Wordpress ещё и использование категорий, но это спорный вопрос

Что избежать дублирование контента, не нужные нам разделы нужно закрыть от индексации инструкцией в  файле robots.txt. Мой robots.txt для DLE (сегодня на 10+ сайтах менял, устал аж :) ):

User-agent: *
Disallow: /user/
Disallow: */rss.xml
Disallow: /tags/
Disallow: /2009/
Disallow: /2010/

User-agent: Yandex
Host: site.ru
Disallow: /user/
Disallow: */rss.xml
Disallow: /tags/
Disallow: /2009/
Disallow: /2010/

user – профили пользователей, минимум оригинальной информации – максимум спама, в топку.

rss.xml – это из-за ошибок в панели вебмастера (формат документа не поддерживается), всё равно в индекс не возьмут, в топку.

tags – злобные теги, все беды из-за них, туда же.

2009-2010 – архивы новостей, календарь, лишнее дублирование контента, закрываем от индексации.

Мой robots.txt для Wordpress:

User-agent: *
Disallow: /wp-admin
Disallow: /wp-includes
Disallow: /wp-content/plugins
Disallow: /wp-content/cache
Disallow: /wp-content/themes
Disallow: /trackback
Disallow: /feed
Disallow: /comments
Disallow: */trackback
Disallow: */feed
Disallow: */comments
Disallow: /tag
Disallow: /clickheat/
Disallow: */comment-page-*
Disallow: /xmlrpc.php
Disallow: /20*
Disallow: */*?replytocom*

User-agent: Yandex
Host: antonblog.ru
Disallow: /wp-admin
Disallow: /wp-includes
Disallow: /wp-content/plugins
Disallow: /wp-content/cache
Disallow: /wp-content/themes
Disallow: /trackback
Disallow: /feed
Disallow: /comments
Disallow: */trackback
Disallow: */feed
Disallow: */comments
Disallow: /tag
Disallow: /clickheat/
Disallow: */comment-page-*
Disallow: /xmlrpc.php
Disallow: /20*
Disallow: */*?replytocom*

Используется на этом блоге, не для всех Wordpress блогов хорошо. Как видно, я не стал закрывать от индексации категории, вместо этого я пользуюсь wordpress тегом <!–more–>. И какой то не правильной мне кажется идея закрытия категорий от индексации – тогда до старых постов как добираться поисковикам? Только по постраничной навигации? Это в скольких кликах от главной что то старое окажется??

Итог – при современном жестком фильтровании Яндексом всего подряд, страницы, сожержащие дубли контента однозначно должны быть закрыты от индексации.

Поговорим о погоде

За последнее время мне пришлось довольно основательно пообщаться с несколькими сервисами Yahoo! В этой заметке расскажу об одном из них, который для многих может оказаться полезным. Это сервис прогноза погоды Yahoo! Weather.

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

Yahoo! Weather порадовал отсутствием перечисленных недостатков. Информация о текущей погоде, а так же прогноз на ближайшие 5 дней экспортируется с их сервера в формате RSS. На мой взгляд, выбор этого формата притянут за уши, т.к. погодная RSS «лента» содержит всего однин item. Те же данные можно было бы экспортировать в более лаконичном виде, но в Yahoo, по всей видимости, расчитывали на стандартные методы обработки RSS, что тоже довольно весомый довод. Стандарт — это все-таки стандарт.

Адрес RSS фида для интересующего города можно найти на сайте weather.yahoo.com.

В общем виде URL выглядит следующим образом:

http://xml.weather.yahoo.com/forecastrss?p=код_города&u=единицы_измерения

Первый параметр — идентификатор интересующего города. Второй параметр определяет, в каких единицах будет выдаваться температура. Значение «c» соответствует градусам Цельсия, «f» — градусам Фаренгейта.

Несколько примеров:

Описанный ниже класс YahooWeather (PHP5) предназначен для загрузки RSS по HTTP и предварительной обработки данных.

<?php

class YahooWeather {
        // Ветер
        public $wind_chill;
        public $wind_direction;
        public $wind_speed;

        // Атмосферные показатели
        public $humidity;
        public $visibility;
        public $pressure;

        // Время восхода и заката переводим в формат unix time
        public $sunrise;
        public $sunset;

        // Текущая температура воздуха и погода
        public $temp;
        public $condition_text;
        public $condition_code;

        // Прогноз погоды на 5 дней
        public $forecast;

        public $units;

        function __construct($code, $units = 'c', $lang = 'en') {
                $this->units = ($units == 'c')?'c':'f';

                $url = 'http://xml.weather.yahoo.com/forecastrss?p='.
                        $code.'&u='.$this->units;

                $xml_contents = file_get_contents($url);
                if($xml_contents === false)
                        throw new Exception('Error loading '.$url);

                $xml = new SimpleXMLElement($xml_contents);

                // Ветер
                $tmp = $xml->xpath('/rss/channel/yweather:wind');
                if($tmp === false) throw new Exception("Error parsing XML.");
                $tmp = $tmp[0];

                $this->wind_chill = (int)$tmp['chill'];
                $this->wind_direction = (int)$tmp['direction'];
                $this->wind_speed = (int)$tmp['speed'];

                // Атмосферные показатели
                $tmp = $xml->xpath('/rss/channel/yweather:atmosphere');
                if($tmp === false) throw new Exception("Error parsing XML.");
                $tmp = $tmp[0];

                $this->humidity = (int)$tmp['humidity'];
                $this->visibility = (int)$tmp['visibility'];
                $this->pressure = (int)$tmp['pressure'];

                // Время восхода и заката переводим в формат unix time
                $tmp = $xml->xpath('/rss/channel/yweather:astronomy');
                if($tmp === false) throw new Exception("Error parsing XML.");
                $tmp = $tmp[0];

                $this->sunrise = strtotime($tmp['sunrise']);
                $this->sunset = strtotime($tmp['sunset']);

                // Текущая температура воздуха и погода
                $tmp = $xml->xpath('/rss/channel/item/yweather:condition');
                if($tmp === false) throw new Exception("Error parsing XML.");
                $tmp = $tmp[0];

                $this->temp = (int)$tmp['temp'];
                $this->condition_text = strtolower((string)$tmp['text']);
                $this->condition_code = (int)$tmp['code'];

                // Прогноз погоды на 5 дней
                $forecast = array();
                $tmp = $xml->xpath('/rss/channel/item/yweather:forecast');
                if($tmp === false) throw new Exception("Error parsing XML.");

                foreach($tmp as $day) {
                        $this->forecast[] = array(
                                'date' => strtotime((string)$day['date']),
                                'low' => (int)$day['low'],
                                'high' => (int)$day['high'],
                                'text' => (string)$day['text'],
                                'code' => (int)$day['code']
                        );
                }
        }

        public function __toString() {
                $u = "°".(($this->units == 'c')?'C':'F');
                return $this->temp.' '.$u.', '.$this->condition_text;
        }
}

?>

Пример использования:

<?php

try {
        $weather = new YahooWeather('RSXX0091');
} catch(Exception $e) {
        echo "Caught exception: ".$e->getMessage();
        exit();
}

echo '<h1>'.$weather.'</h1>';

echo "<pre>";
print_r($weather);
echo "</pre>";

?>

Вывод:

Временные значения восхода и заката солнца (поля sunrise и sunset соответственно) автоматически переводятся в формат unix time. стоит так же обратить внимание на то, что по непонятной причине Yahoo! выдает явно некорректное значение атмосферного давления (0). Но само наличие соответствующего атрибута в XML дает некоторую надежду на то, что рано или поздно экспорт этих данных починят.

Поле condition_code используется для хранения кодового обозначения погодных условий. Текстовая расшифровка текущего значения хранится в поле condition_text, а полный перечень возможных вариантов приведен в следующей таблице:

Код Описание
0 tornado
1 tropical storm
2 hurricane
3 severe thunderstorms
4 thunderstorms
5 mixed rain and snow
6 mixed rain and sleet
7 mixed snow and sleet
8 freezing drizzle
9 drizzle
10 freezing rain
11 showers
12 showers
13 snow flurries
14 light snow showers
15 blowing snow
16 snow
17 hail
18 sleet
19 dust
20 foggy
21 haze
22 smoky
23 blustery
24 windy
25 cold
26 cloudy
27 mostly cloudy (night)
28 mostly cloudy (day)
29 partly cloudy (night)
30 partly cloudy (day)
31 clear (night)
32 sunny
33 fair (night)
34 fair (day)
35 mixed rain and hail
36 hot
37 isolated thunderstorms
38 scattered thunderstorms
39 scattered thunderstorms
40 scattered showers
41 heavy snow
42 scattered snow showers
43 heavy snow
44 partly cloudy
45 thundershowers
46 snow showers
47 isolated thundershowers
3200 not available

Поговорим о погоде

За последнее время мне пришлось довольно основательно пообщаться с несколькими сервисами Yahoo! В этой заметке расскажу об одном из них, который для многих может оказаться полезным. Это сервис прогноза погоды Yahoo! Weather.

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

Yahoo! Weather порадовал отсутствием перечисленных недостатков. Информация о текущей погоде, а так же прогноз на ближайшие 5 дней экспортируется с их сервера в формате RSS. На мой взгляд, выбор этого формата притянут за уши, т.к. погодная RSS «лента» содержит всего однин item. Те же данные можно было бы экспортировать в более лаконичном виде, но в Yahoo, по всей видимости, расчитывали на стандартные методы обработки RSS, что тоже довольно весомый довод. Стандарт — это все-таки стандарт.

Адрес RSS фида для интересующего города можно найти на сайте weather.yahoo.com.

В общем виде URL выглядит следующим образом:

http://xml.weather.yahoo.com/forecastrss?p=код_города&u=единицы_измерения

Первый параметр — идентификатор интересующего города. Второй параметр определяет, в каких единицах будет выдаваться температура. Значение «c» соответствует градусам Цельсия, «f» — градусам Фаренгейта.

Несколько примеров:

Описанный ниже класс YahooWeather (PHP5) предназначен для загрузки RSS по HTTP и предварительной обработки данных.

<?php

class YahooWeather {
        // Ветер
        public $wind_chill;
        public $wind_direction;
        public $wind_speed;

        // Атмосферные показатели
        public $humidity;
        public $visibility;
        public $pressure;

        // Время восхода и заката переводим в формат unix time
        public $sunrise;
        public $sunset;

        // Текущая температура воздуха и погода
        public $temp;
        public $condition_text;
        public $condition_code;

        // Прогноз погоды на 5 дней
        public $forecast;

        public $units;

        function __construct($code, $units = 'c', $lang = 'en') {
                $this->units = ($units == 'c')?'c':'f';

                $url = 'http://xml.weather.yahoo.com/forecastrss?p='.
                        $code.'&u='.$this->units;

                $xml_contents = file_get_contents($url);
                if($xml_contents === false)
                        throw new Exception('Error loading '.$url);

                $xml = new SimpleXMLElement($xml_contents);

                // Ветер
                $tmp = $xml->xpath('/rss/channel/yweather:wind');
                if($tmp === false) throw new Exception("Error parsing XML.");
                $tmp = $tmp[0];

                $this->wind_chill = (int)$tmp['chill'];
                $this->wind_direction = (int)$tmp['direction'];
                $this->wind_speed = (int)$tmp['speed'];

                // Атмосферные показатели
                $tmp = $xml->xpath('/rss/channel/yweather:atmosphere');
                if($tmp === false) throw new Exception("Error parsing XML.");
                $tmp = $tmp[0];

                $this->humidity = (int)$tmp['humidity'];
                $this->visibility = (int)$tmp['visibility'];
                $this->pressure = (int)$tmp['pressure'];

                // Время восхода и заката переводим в формат unix time
                $tmp = $xml->xpath('/rss/channel/yweather:astronomy');
                if($tmp === false) throw new Exception("Error parsing XML.");
                $tmp = $tmp[0];

                $this->sunrise = strtotime($tmp['sunrise']);
                $this->sunset = strtotime($tmp['sunset']);

                // Текущая температура воздуха и погода
                $tmp = $xml->xpath('/rss/channel/item/yweather:condition');
                if($tmp === false) throw new Exception("Error parsing XML.");
                $tmp = $tmp[0];

                $this->temp = (int)$tmp['temp'];
                $this->condition_text = strtolower((string)$tmp['text']);
                $this->condition_code = (int)$tmp['code'];

                // Прогноз погоды на 5 дней
                $forecast = array();
                $tmp = $xml->xpath('/rss/channel/item/yweather:forecast');
                if($tmp === false) throw new Exception("Error parsing XML.");

                foreach($tmp as $day) {
                        $this->forecast[] = array(
                                'date' => strtotime((string)$day['date']),
                                'low' => (int)$day['low'],
                                'high' => (int)$day['high'],
                                'text' => (string)$day['text'],
                                'code' => (int)$day['code']
                        );
                }
        }

        public function __toString() {
                $u = "°".(($this->units == 'c')?'C':'F');
                return $this->temp.' '.$u.', '.$this->condition_text;
        }
}

?>

Пример использования:

<?php

try {
        $weather = new YahooWeather('RSXX0091');
} catch(Exception $e) {
        echo "Caught exception: ".$e->getMessage();
        exit();
}

echo '<h1>'.$weather.'</h1>';

echo "<pre>";
print_r($weather);
echo "</pre>";

?>

Вывод:

Временные значения восхода и заката солнца (поля sunrise и sunset соответственно) автоматически переводятся в формат unix time. стоит так же обратить внимание на то, что по непонятной причине Yahoo! выдает явно некорректное значение атмосферного давления (0). Но само наличие соответствующего атрибута в XML дает некоторую надежду на то, что рано или поздно экспорт этих данных починят.

Поле condition_code используется для хранения кодового обозначения погодных условий. Текстовая расшифровка текущего значения хранится в поле condition_text, а полный перечень возможных вариантов приведен в следующей таблице:

Код Описание
0 tornado
1 tropical storm
2 hurricane
3 severe thunderstorms
4 thunderstorms
5 mixed rain and snow
6 mixed rain and sleet
7 mixed snow and sleet
8 freezing drizzle
9 drizzle
10 freezing rain
11 showers
12 showers
13 snow flurries
14 light snow showers
15 blowing snow
16 snow
17 hail
18 sleet
19 dust
20 foggy
21 haze
22 smoky
23 blustery
24 windy
25 cold
26 cloudy
27 mostly cloudy (night)
28 mostly cloudy (day)
29 partly cloudy (night)
30 partly cloudy (day)
31 clear (night)
32 sunny
33 fair (night)
34 fair (day)
35 mixed rain and hail
36 hot
37 isolated thunderstorms
38 scattered thunderstorms
39 scattered thunderstorms
40 scattered showers
41 heavy snow
42 scattered snow showers
43 heavy snow
44 partly cloudy
45 thundershowers
46 snow showers
47 isolated thundershowers
3200 not available

Обмен данными для документов с разных доменов

Кросс-доменный скриптинг - общее название для случая, когда страницы с одного домена производят запрос на другой.

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

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

site1.net делает запрос на site2.net - в этом случае домены совершенно разные.

Документы, полученные в одном фрейме с site1.net не смогут обращаться к другому через JS, если он с site2.net.
Вообще, документы с разных доменов, протоколов или с разных портов (кроме IE) одного домена не могут общаться друг с другом (согласно same origin policy), и нельзя посылать XMLHTTPRequest на домен, отличный от текущего.

Самое простое решение - это проксирование запроса сервером. То есть, site1.net делает специальный запрос, например, на особенный URL
типа http://site1.net/proxy/site2.net/test.html, и сервер site1.net проксирует его на http://site2.net/test.html.

>

Если оба сайта работают на одном движке, то можно обойтись даже без проксирования, просто соответствующим образом закодировать обработку запросов
http://site1.net/proxy/*.

Из минусов такого подхода - лишняя нагрузка на сервер и дополнительные сетевые задержки при проксировании. Особенность - необходимость соответствующей серверной инфраструктуры.

Наиболее известный транспорт, позволяет такие запросы - это SCRIPT, т.к <script src="..."> может подгружать яваскрипт с любого домена.

  • Запросы на любые домены
  • Только GET
  • Необходима обертка в Javascript
  • Сложно отслеживать ошибки, лаги и т.п.

Если допустимо использование Flash - в нем есть свои средства кросс-доменных соединений (crossdomain.xml), и можно удобно передавать данные из flash в javascript.

Передача данных из javascript во flash несколько сложнее, но тоже осуществима.

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

  • Flash предоставляет универсальные средства обмена данными
  • Нужен рабочий Flash и "мост" из javascript во flash

Из смеси XMLHTTPRequest и Iframe получается оригинальный хак, называемый XhrIframeProxy. Он позволяет делать кросс-доменные запросы XmlHttpRequest, и успешно протестирован в Internet Explorer 6/7, Firefox 1.5+, Safari 2.0.3 и Opera 9.

Транспорт основан на том, что ифреймы, даже находясь на разных доменах, могут общаться друг с другом при помощи изменения идентификаторов фрагментов адресов.

Идентификатор фрагмента - это то, что идет в URL после решетки: http://site.com/path/to/file.html#fragment.

Документ, загруженный в IFrame, может менять идентификатор фрагмента родительского документа (т.е документа, содержащего iframe). Изменение фрагмента не приводит
к перезагрузке страницы. И, аналогично, родительский документ может менять идентификатор фрагмента в ифрейме.

Путем последовательных изменений #фрагмента образуется поток данных, который может передаваться в обе стороны. Т.к идентификатор фрагмента - текст, то все данные для передачи приходится (де)сериализовать, т.е превращать в JSON.

Для транспорта необходимо создать два ифрейма. Один - клиентский, на том же домене, что и основное окно, и в нем - серверный, на домене сервера.

  1. На клиенте - создать ифрейм, в который загрузить специальный документ с сервера на другом домене
  2. Определить протокол передачи информации через идентификаторы фрагмента
  3. Сообщить обоим документам URL друг друга, так чтобы они могли правильно устанавливать идентификаторы фрагмента (чтобы установить адрес на другом домене, браузеру нужен полный URL)
  4. Использовать таймер javascript для обнаружения изменений фрагментов

Чтобы послать XMLHTTPRequest на другой домен:

  1. Создать javascript-объект, который реализует интерфейс XMLHTTPRequest (фасад)
  2. Использовать этот объект вместо реального объекта XMLHTTPRequest
  3. Для метода send() фасада сериализовать заголовки, метод, URL и данные запроса
  4. Браузер накладывает ограничение на размер URL документа, поэтому клиентский документ разбивает сериализованные данные в набор идентификаторов фрагментов подходящего размера
  5. Клиентский документ по очереди отсылает идентификаторы фрагментов на серверный документ (в ифрейм). Серверный документ подтверждает получение каждого
    идентификатора, и так - до тех пор, пока все данные не будут переданы.
  6. Серверный документ собирает из идентификаторов фрагментов исходные данные и преобразует их обратно в объект, а затем использует настоящий XMLHTTPRequest (на
    серверном домене), чтобы сделать запрос к серверу
  7. Затем серверный документ сериализует ответ на XMLHTTPRequest, и точно так же передает клиентскому документу через идентификаторы фрагмента
  8. Клиентский документ распаковывает ответ и ставит соответствующие значения в фасаде
  • 100% javascript
  • Легко вставляется в код, который использует XMLHTTPRequest
  • Техника использует ифреймы, поэтому требует больше памяти, чем родной XMLHTTPRequest
  • Трафик - в оба служебных ифрейма нужно загрузить изначальные скрипты и документы. В дальнейшем они могут быть кешированы
  • Установка URL'ов в IFrame'ы дает кликающие звуки в Internet Explorer. Это можно исправить при помощи ActiveX (описано в разделе транспорта Iframe)

Основной реальный минус, по мнению автора - это конкретный хак. С другой стороны, более пристойные предложения, хоть и внесены в W3C, но еще долго будут выходить
в мейнстрим. Несмотря на неказистый внешний вид: ифреймы, таймеры, сериализация - этот транспорт работает и кросс-браузерный.

XhrIframeProxy - не дает открытый доступ к любому сервису с XMLHTTPRequest API. Для того, чтобы этот транспорт работал, на сервере должен быть серверный документ, для загрузки в серверный ифрейм. Клиент никак не может повлиять на этот документ, т.к он с другого домена. Клиент обязан сообщить серверному документу свой полный URL, т.к он используется для установки идентификаторов фрагмента.

На основании клиентского URL и данных запроса серверный документ может и должен, перед тем, как делать реальный запрос на сервер, фильтровать, что и кому разрешено.

XhrIframeProxy реализован в dojo toolkit, и описан в dojo book: Cross Domain XMLHttpRequest using an IFrame Proxy. На момент написания этих слов, документация в dojo book устарела, лучше смотреть реализацию в SVN.

Так назовем коммуникацию, когда domain1.site.net делает запрос на domain2.site.net или site.net. То есть, когда есть общий наддомен, в данном случае site.net.

Основной вопрос - зачем такое вообще может понадобиться?

Первый сценарий - наш сайт domain.site.net является частью некой системы, в которой адрес news.site.net предоставляет ленту новостей, goods.site.net - товары,
и т.п., так что мы, имея такой домен, можем с удобством пользоваться этими вебсервисами.

Второй сценарий - оба таких сайта находятся под нашим контролем… Скажем, www.site.net и site.net формально на разных доменах, но могут одинаково обрабатываться сервером.

В таком случае все необходимые запросы можно сделать и на текущий домен - они так и так попадут к нам на сервер.
Но здесь появляется второе применение кросс-доменного скриптинга. А именно, обход ограничения HTTP 1.1 на соединения: не более двух одновременных запросов к серверу(домену/порту/протоколу).

Однажды, мне пришлось писать AJAX-компонент, который делает запросы к нескольким вебсервисам, причем время отклика может варьироваться (в зависимости от запроса) между 1-20 сек. При этом одно соединение было постоянно занято подгрузкой бесконечного ифрейма с сервера, через которое поступают обновления (push данных со стороны сервера в виде <script>-тагов). Оставался один канал на все про все - явно недостаточно для асинхронных запросов.

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

Кросс-доменный скриптинг позволяет обойти лимит путем использования нескольких доменов. Бесконечный ифрейм подгружаем с updates.site.net, чат работает на chat.site.net, и свободны основные 2 канала для запросов с site.net.

Другой, пожалуй более распространенный пример использования - когда на основном сервере site.net крутится веб-сервер типа Apache, который не очень любит долговременные соединения, а на сервере chat.site.net крутится демон чата. Получается, что документы с разных серверов могут полноценно взаимодействовать на клиенте.

Как известно, обычно javascript из одного фрейма может как-то вызывать другой фрейм, только если они с одного домена. Но домен хранится в специальном свойстве document.domain, которое можно менять. Так что если два фрейма имеют один document.domain , то они могут делать друг с другом что угодно.

Конечно, есть ограничения безопасности - document.domain можно присваивать:

  • На текущий домен
  • На наддомен, но не вида org.ru (т.е job.site.com.ua можно поменять на site.com.ua, но не на com.ua)
  • В Firefox/Opera, после изменения домена на более короткий - вернуть домен обратно нельзя, в IE - можно

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

Обращаю внимание, что даже если документ и так с нужного домена site.com, то все равно нужно поставить document.domain:

// в документе с site.com надо поставить домен, хотя бы и так
document.domain = document.domain

После смены домена с domain.site.com на site.com, можно не только вызывать javascript для других документов с site.com, но и делать XMLHTTPRequest-запросы на site.com.

Что делать, если хочется делать запросы и на более короткий домен site.com и на исходный domain.site.com?

Перед следующим запросом в IE нужно вернуть document.domain обратно. В Opera/FF это невозможно (домен может быть установлен только в текущий или в домен высшего уровня), но в Opera 9/FF 1.5+ ситуация поправлена тем, что повторные запросы с исходного домена разрешаются.

Итак, алгоритм для IE/FF 1.5+/Opera 9

  1. Создать IFrame c другим поддоменом
  2. Сделать запрос с этого IFrame
  3. Установить document.domain такой же как у фрейма, куда надо отправить информацию и вызвать нужные функции
  4. Для IE - вернуть document.domain обратно перед следующим запросом

В этом примере используется как общение ифреймов с общим наддоменом, так и XMLHTTPRequest. Основной документ http://tmp.x/main.html регулярно получает данные с http://www.tmp.x/time.php, используя для этого промежуточный ифрейм http://www.tmp.x/iframe.html.

>

Общая логика:

  • Изначально iframe берется с домена, на который надо делать XHR-запросы
  • Затем для общения с родителем document.domain ставится равный общему с родителем наддомену, для общения с исходным доменом document.domain возвращается обратно. Возникающие при этом исключения игнорируются
01<html>
02<head>
03    <script type="text/javascript">
04        <!-- обрезаем домен текущей страницы до базового -->
05        document.domain="tmp.x";
06        <!-- эту функцию будет вызывать ифрейм с www.tmp.x -->
07        function gotTime(result) { document.getElementById('time').innerHTML = result }
08    </script>
09</head>
10<body>
11    Счетчик
12    <div id="time"></div>
13    <!-- iframe с другого домена -->
14    <iframe src="http://www.tmp.x/iframe.html"></iframe>
15</body>
16</html>
01<html>
02<head>
03    <!-- подгружаем функцию getUrl (делает XMLHTTPRequest) -->
04    <script type="text/javascript" src="/forum/xmlhttp.js"></script>
05    <script type="text/javascript">
06        function getTime(){
07            // сделать запрос на адрес с того же домена, что и iframe,
08            // указать каллбэк gotResult
09            getUrl("http://www.tmp.x/time.php", gotResult);
10        }
11        getTime();
12 
13        // каллбэк для обработки результата запроса
14        function gotResut(status, headers, result) {
15            // для общения с родительским документом нужно поменять domain на tmp.x
16            var oldDomain = document.domain
17            document.domain = "tmp.x"
18            // и вызвать родителя, document.domain поставлен одинаковый там и тут
19            window.parent.gotTime(result)
20  
21            // вернуть домен обратно на www.tmp.x, это необходимо IE,
22            // чтобы сделать новый запрос на www.tmp.x
23            try {
24                // для IE, в остальных браузерах ошибка...
25                document.domain = oldDomain;
26            } catch(e) {  /* ... но там это не нужно */ }
27 
28            // запускаем новый запрос..
29            getTime()
30        }
31    </script>
32</head>
33<body></body>
34</html>

В коде iframe.html домен меняется туда-обратно, потому что нужно делать запросы на www.tmp.x, а ответ сообщать документу с tmp.x.

О новых способах кросс-доменного общения читайте в продолжении этой статьи: Обмен данными между доменами. Часть 2..

«Гламурный» информер с Gismeteo для MODx

Собственно, на многих сайтах так или иначе бывает полезно воткнуть сведения о том, какая нынче погода в том или ином месте нашей планеты. Поскольку содержать свою собственную метеослужбу большинству людей по меньшей мере накладно, куда логичнее воспользоваться каким-нибудь из ресурсов, предоставляющих бесплатные погодные информеры на достаточно мягких основаниях (всего лишь надо поставить ссылку на их сайт). Один из самых известных и популярных сервисов - это http://gismeteo.ru . Но его стандартные информеры подойдут далеко не каждому... а что, если захочется переделать дизайн информера под фирменный стиль компании, или же охватить одним информером сразу несколько городов (по умолчанию там на один информер - один город)? Вот, например, недавний заказчик, туристическая компания, захотела информер со списком мест, в которых они работают. Вот такой (скриншот конечного результата):

чего мы хотим добиться

Думаете, так сделать нельзя? Ещё как можно, и, более того, я уже облегчила вам работу, сегодня за вечерок написав специальный сниппет для MODx с парой демо-шаблонов!

Собственно, качем маленький архивчик. В нём, как мы видим, три файла - собственно, сам сниппет (файл gismeteo.php, для корректной работы требует libxslt, впрочем, на большинстве нормальных хостингов эта библиотека включена) и два xsl-файла с шаблонами. Собственно, думаю, для человека, знакомого с идеологией MODx, не возникнет проблем с инсталляцией: идём в "управление ресурсами", создаём новый сниппет, называем его, допустим, Gismeteo - и копипастим туда содержимое файла gismeteo.php. Так же и с шаблонами - для каждого из них создаём чанк (я старалась придерживаться идеологии MODx и не использовать подключение файлов с жёсткого диска без особой нужды), причём было бы неплохо один из этих чанков назвать "informer" - это значение параметра tpl по умолчанию... впрочем, дальше об этом будет написано поподробнее.

Прежде чем я перейду к подробному разбору параметров вызова сниппета (благо их всего два) и логики его работы - маленькое лирическое отступление. Почему, собственно, XSLT - хотя это не самая быстрая, казалось бы, технология? Да потому, что Gismeteo предлагает очень удобную фичу - получение погодных сводок в XML-формате. И именно при помощи XSLT-шаблонов мы можем представить эту информацию как угодно, сведя к минимуму "зашивание" представления информации в php-код и существенно сэкономив количество строчек этого самого кода. И, более того, ведь нас никто не ограничивает - за один вызов сниппета мы можем запросить информацию сразу по нескольким городам, наложив потом на эту информацию общий шаблон представления... что нам и требовалось, верно?

Посему вызов сниппета прост как сибирский валенок. Что-то типа:

[[Gismeteo? &tpl=`informer_full` &source=`http://informer.gismeteo.ru/xml/32150_1.…`]]

Да, как я и говорила, параметра всего два. Параметр tpl - это имя чанка с XSLT-шаблоном (по умолчанию - "informer"). Параметр source - разделённый запятыми список URL-ов, по которым лежат XML-информеры для нужных вам городов (получить эти URL-ы можно по ссылке выше). Если параметр source не указывать, по умолчанию он будет равен информеру для столицы нашей славной родины :)

Как это работает. Сам сниппет выводит таблицу с заголовком. Внутри неё запускается итератор по всему списку значений параметра source. Иными словами, для каждого города мы получаем XML-исходник, перекодируем его в нормальный человеческий UTF-8 (а то в оригинале оно отдаётся в гадском cp1251, да ещё и методом urlencode прикодированное), накладываем на него XSL-стиль (преобразуем в нормальные <tr>-ы для таблицы, проще говоря) - и потом заменяем в получившемся HTML-е числовые значения для параметров "облачность" и "осадки" на нормальные словесные аналоги. Да, не очень удобно, что аж три этапа парсинга, да ещё и приходится "жёстко" зашивать в шаблон классы cloudiness и precipitation - но, увы, тут ничего не поделаешь, ибо хозяин - барин, как захотел отдать XML, так его и отдал. Ну да ладно. Подробности всего этого можно посмотреть в коде - благо он совсем маленький, да ещё и с комментариями. В конечном итоге мы получаем аккуратненькую табличку - и над ней уже можем всячески извращаться при помощи CSS, "затачивая" её под дизайн всего остального.

В общем - enjoy! Думаю, найдутся таки те, кому эта маленькая, но полезная штучка пригодится...

P.S. Нет, сайт Gismeteo мне не платит за рекламу, не подумайте :)

Парсинг XML в JavaScript на примере XML-погоды от gismeteo.ru

Итак, заинтересовала меня тема, как распарсить XML-файл посредством JavaScript. Немного порыскав в поисковиках наткнулся на весьма познавательную статью по этой теме XML в Microsoft Internet Explorer 5.0. Есть у этой статьи маленький недостаток – она посвящена только IE, а мы в нашем блоге твердо решили писать только кроссбраузерный код. Однако, для начала хватило и этой статьи, сначала весь код был написан для IE, и затем была осуществлена безуспешная попытка запустить его также в Opera, Mozilla, Chrome. Но как я уже говорил “не боги горшки обжигают”, все некроссбраузерные баги были успешно найдены и исправлены. Это р-раз.

В качестве подопытного кролика был взят XML-файл, содержащий в себе данные о погоде на ближайшие сутки от Gismeteo.ru. Собственно, открыв эту страницу, и выбрав интересующий вас город, вы можете ниже на той же странице наблюдать содержимое этого XML-файла, и описание его структуры. Это д-два.

Сопоставив первые два пункта уже можно сваять свой собственный парсер XML-документов на JavaScript, однако если вам лень, то читайте статью дальше. В ней я расскажу о том, как провести анализ содержимого XML-файла и отобразить его в том виде, в котором вам хочется. Это т-три.

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

Сразу хочу предупредить, что ниже пойдет теоретическая и практическая часть работы с XML-файлами, и если вам не хочется вникать во все эти подробности, то вы можете сразу перейти в самый конец статьи и по предложенной там ссылке скачать готовый скрипт обработки XML-документа, содержащего прогноз погоды от gismeteo.ru. А теперь теория…

Итак, что же такое XML? Wikipedia утверждает, что:

XML (eXtensible Markup Language — расширяемый язык разметки) — рекомендованный консорциумом W3C язык разметки, представляющий собой свод общих синтаксических правил. XML — текстовый формат, предназначенный для хранения структурированных данных, для обмена информацией между программами, а также для создания на его основе более специализированных языков разметки. Целью создания XML было обеспечение совместимости при передаче структурированных данных между разными системами обработки информации, особенно при передаче таких данных через Интернет.

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

Остальная часть XML-документа состоит из вложенных элементов, которые могут иметь атрибуты и содержимое. Элемент обычно состоит из пары тегов (открывающего и закрывающего), обрамляющих другие элементы. Открывающий тег состоит из имени элемента в угловых скобках, например, <FORECAST> ; закрывающий тег состоит из того же имени в угловых скобках, но перед именем ещё добавляется косая черта, например, </FORECAST>. Содержимым элемента называется всё, что расположено между открывающим и закрывающим тегами, включая текст и другие вложенные элементы.

Кроме содержания у элемента могут быть атрибуты — пары имя-значение, добавляемые в открывающий тег после названия элемента. Например в случае <PHENOMENA cloudiness=”2″ precipitation=”10″ rpower=”0″ spower=”0″/>
элемент PHENOMENA имеет 4 атрибута cloudiness, precipitation, rpower и spower имеющие соответственно значения 2, 10, 0, 0.

Итак, со структурой XML-файла более-менее разобрались. Осталось только понять, каким образом все это богатство обрабатывать в JavaScript. Собственно, в статье XML в Microsoft Internet Explorer 5.0 можно обо всем этом прочесть, но я намерен вкратце обрисовать ниже основные приемы анализа XML-файлов в контексте поставленной в начале статьи задачи – разбора XML-документа, содержащего прогноз погоды на сутки от gismeteo.

  1. Загрузка XML-документа. Хочу сразу заметить, что загрузка любых файлов из JavaScript возможна при соблюдении одного обязательного условия – загружаемый файл должен быть расположен в том же домене, где и сама страница его загружающая. Поэтому невозможно со страницы, расположенной, например, по адресу http://easy4web.ru/samples/gismeteo/ загрузить файл с сайта http://gismeteo.ru. А это означает, что … проблему надо как-то решать. Есть два пути: либо скачать файл с сайта gismeteo.ru на свой домен, либо создать на вашем домене простой PHP-обработчик, который сам будет скачивать файл с другого домена и выдавать его содержимое от своего имени. В предлагаемом мною решении я пошел по второму пути и поэтому чуть ниже приведу вам PHP-скрипт, выполняющий данное действие. А теперь, собственно, о загрузке XML-документов.
    В IE эта операция производится с помощью следующего кода

    1. xml=new ActiveXObject("Microsoft.XMLDOM");  
    2. xml.async=false;  
    3. xml.load(url);  
    xml=new ActiveXObject("Microsoft.XMLDOM");
    xml.async=false;
    xml.load(url);

    После выполнения которого в переменной xml будет храниться обработанный XML-Документ. Конечно, если документ был верно отформатирован. В ином случае будет сгенерировано исключение.
    Во всех остальных браузерах (Opera, Firefox, Chrome) загрузка файлов выглядит иначе:

    1. xml=new window.XMLHttpRequest();  
    2. xml.open("GET", url, false);  
    3. xml.send("");  
    xml=new window.XMLHttpRequest();
    xml.open("GET", url, false);
    xml.send("");

    После чего в поле xml.responseXML можно обнаружить обработанный XML-документ. Таким образом, полный текст функции, осуществляющей загрузку XML-документа, будет выглядеть следующим образом:

    1. function getXMLDocument(url)  
    2. {  
    3.     var xml;  
    4.     if(window.XMLHttpRequest)  
    5.     {  
    6.         xml=new window.XMLHttpRequest();  
    7.         xml.open("GET", url, false);  
    8.         xml.send("");  
    9.         return xml.responseXML;  
    10.     }  
    11.     else  
    12.         if(window.ActiveXObject)  
    13.         {  
    14.             xml=new ActiveXObject("Microsoft.XMLDOM");  
    15.             xml.async=false;  
    16.             xml.load(url);  
    17.             return xml;  
    18.         }  
    19.         else  
    20.         {  
    21.             alert("Загрузка XML не поддерживается браузером");  
    22.             return null;  
    23.         }  
    24. }  
    function getXMLDocument(url)
    {
        var xml;
        if(window.XMLHttpRequest)
        {
            xml=new window.XMLHttpRequest();
            xml.open("GET", url, false);
            xml.send("");
            return xml.responseXML;
        }
        else
            if(window.ActiveXObject)
            {
                xml=new ActiveXObject("Microsoft.XMLDOM");
                xml.async=false;
                xml.load(url);
                return xml;
            }
            else
            {
                alert("Загрузка XML не поддерживается браузером");
                return null;
            }
    }
  2. Получение коллекции элементов по имени элемента производится использованием метода getElementsByTagName(tagname) объекта XMLDOMDocument. Например, получить массив всех элементов TOWN можно так: xml.getElementsByTagName(”TOWN”). Понятно, что в переменную xml уже должен быть загружен сам XML-документ.
  3. Просмотр коллекции элементов лучше проводить с помощью цикла for, так как итератор nextNode() пригодный для использования в цикле while, увы, не определен для результата, возвращаемого объектом XMLHttpRequest, а значит будет работать только в IE. Вот код для просмотра коллекции элементов циклом for:
    1. var towns=xml.getElementsByTagName("TOWN");  
    2. if(towns)  
    3. for(var i1=0; i1<towns.length; i1++)  
    4. {  
    5.    town=towns[i1];  
    6.    // операции над текущим элементом town  
    7. }  
    var towns=xml.getElementsByTagName("TOWN");
    if(towns)
    for(var i1=0; i1<towns.length; i1++)
    {
       town=towns[i1];
       // операции над текущим элементом town
    }
  4. Получение атрибутов элемента.
    Вообще, все атрибуты элемента хранятся в его коллекции attributes, однако доступ к ней неудобен, и поэтому я написал простую функцию, которая пробегает по всей коллекции атрибутов и распаковывает ее в удобный для работы массив, позволяющий получить доступ к любому атрибуту через оператор “квадратные скобки”. Вот эта функция:

    1. function getAttributes(node)  
    2. {  
    3.   var ret = new Object();  
    4.   if(node.attributes)  
    5.   for(var i=0; i<node.attributes.length; i++)  
    6.   {  
    7.     var attr = node.attributes[i];  
    8.     ret[attr.name] = attr.value;  
    9.   }  
    10.   return ret;  
    11. }  
    function getAttributes(node)
    {
      var ret = new Object();
      if(node.attributes)
      for(var i=0; i<node.attributes.length; i++)
      {
        var attr = node.attributes[i];
        ret[attr.name] = attr.value;
      }
      return ret;
    }

Вот собственно и вся предварительная подготовка. Используя эту информацию, уже можно написать анализатор XML-файлов с прогнозом погоды. Конечно, работа с XML-файлами гораздо сложнее, чем я здесь описал, но для пытливых умов существуют книги, интернет, поисковики.

Вот ссылка на готовый скрипт парсера XML-погоды. Вам следует только обратить внимание на шаблоны (переменная template) в конце файла index.html. Это объект в JSON-нотации, содержащий в себе следующие поля: “town”, “forecast”, “phenomena”, “pressure”, “temperature”, “wind”, “relwet”, “heat”, “t_forecast”, “t_template”. Первые 8 представляют собой строки, в которых хранятся шаблоны отображения конкретных нюансов прогноза: город, дата прогноза, атмосферные явления, давление, температура, ветер, относительную влажность, комфортную температуру. В HTML-разметку каждого шаблона вставляются конкретные данные прогноза, которые имеют вид соответствующих имен атрибутов, взятых в фигурные скобки. Все имена атрибутов вы можете увидеть внизу страницы Gismeteo.ru. Для некоторых числовых атрибутов существуют также их строковые псевдонимы, получаются они путем прибавления к атрибуту префикса “s”. Абсолютно все используемые в шаблонах атрибуты вы можете увидеть в конце HTML-разметки страницы index.html, в тегах <script>.

И еще два шаблона, используемых в переменной template. Это t_forecast и t_template. Первый задает разметку прогноза для конкретного времени суток, а второй – разметку для всех прогнозов одного города.

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

Где-то в середине статьи я обещал показать код PHP-Обработчика, скачивающего XML с других сайтов. Код этот вы можете увидеть в архиве с исходниками в файле xml.php. Он короткий и в пояснениях не нуждается.

Выпечка

Как необъятна и разноязычна наша планета, так многообразны и традиции, обычаи, привычки населяющих её народов, так самобытна и их кухня, и прежде всего пироги – подлинный вид народного творчества.

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

Упоминание о пирогах и блинах неразрывно связано и с народным весенним гуляньем – масленицей (проводы зимы). Масленичный обряд очень древний. Считается, что блин, круглый и горячий, - символ солнца. Блинами, «жаворонками» из теста славяне встречали весну, приветствовали возрождающиеся силы природы, призывали хорошую погоду, добрые урожаи. К масленице выпекали как гимн весне символический пирог – «Лира с жаворонками».

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

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

Каких только пирогов не пекут. С мясом, рыбой, визигой, яйцами, кашей, репой, луком, картофелем, капустой, морковью, щавелем, ревенем, солеными огурцами, квашеной капустой, сельдью, грибами, маком, творогом, курагой, черносливом, яблоками, ягодами. Каких только ягод – лесных и садовых – не использовали для пирогов: землянику, чернику, малину, голубику, бруснику, вишню, сливу, черемуху. Известны и пироги с дикорастущими травами, например с кислицей (заячьей капустой), пряной зеленью – укропом, сельдереем. Для начинок используют также зайчатину, пернатую дичь, курятину, и даже петушиные гребешки – символ мужской мощи. Велико разнообразие выпечки не только по вкусу, но и по форме: открытые, закрытые, курники, расстегаи, кулебяки, косовики, рядовики, калачи, караваи, колобки, калитки, шанежки, пирожки, саечки, лодочки, розанчики, крендельки, ватрушки.

Щедрое хлебосольство с неисчерпаемым перечнем перемен, пожалуй, самый излюбленный сюжет русской литературы. Достаточно вспомнить «Мертвые души» Н. В. Гоголя, в частности визит Чичикова к помещице Коробочке: «… он потянул несколько к себе носом воздух и услышал завлекательный запах чего-то горячего в масле.

- Прошу покорно закусить, - сказала хозяйка.

Чичиков оглянулся и увидел, что на столе стояли уже грибки, пирожки, скородумки, шанежки, пряглы, блины, лепешки со всякими припеками: припекой с лучиком, припекой с маком, припекой с творогом, припекой со сняточками, и невесть чего там не было».

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

Как утверждает пословица, «глаза помогают есть». Это надо понимать так: выпечка, затейливо изукрашенная, вкуснее. Не случайно пекари проявляли в своем деле не меньшее искусство, чем Левша, подковавший блоху. Казалось бы, зачем тратить драгоценное время на изделие, «жизнь» которого столь недолговечна: испек – съел. Но выпечка во все времена не просто вкусная и сытая еда и даже не произведение искусства - это встреча с близкими, общение в кругу друзей. Словом, праздник, а праздник должен быть красивым.

Основы нутрициологии

В середине XIX века возникла первая серьезная теория энергетически сбалансированного питания, а с ней и наука о питании – диетология. Суть энергетически сбалансированного питания: идеальным считается питание, при котором приток пищевых веществ в организм соответствует их расходу; пища должна содержать белки, жиры, углеводы в определенных пропорциях, а также витамины и микроэлементы. На основе данной концепции были разработаны различные пищевые рационы для всех групп населения с учетом физических нагрузок, климатических и других условий, созданы новые пищевые технологии. Сбалансированное питание – это учет всего комплекса факторов питания, их взаимосвязи в обменных процессах, а также индивидуальности ферментных и химических превращений в организме. Крупный вклад в развитие этой теории внесли академик А. А, Покровский и его ученики.


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


Опираясь на вновь полученные экспериментальные и клинические данные, возникла теория адекватного питания. Основные положения этой теории: питательные вещества образуются из пищи при ферментативном расщеплении ее макромолекул за счет полостного и мембранного пищеварения, а также формирования в кишечнике при участии симбиотической микрофлоры новых химических компонентов, в том числе незаменимых; необходимым компонентом пищи являются не только полезные, но и балластные вещества (пищевые волокна). В разработку теории адекватного питания существенный вклад внес академик А. М. Уголев. На основе теории адекватного питания разработаны различные научные концепции приема пищи.


Начиная с середины XX века, в экономически развитых странах получила развитие система так называемого индустриального питания. В основе этой системы лежит промышленная обработка продуктов питания с целью увеличения объемов производства, увеличения срока их хранения, улучшения вкусовых качеств, создания внешней привлекательности. Большое развитие получило промышленное производство консервов, кондитерских изделий с длительным сроком хранения (кексы, бисквиты и т. п.), рафинированных полуфабрикатов (порошок пюре, макароны типа Роллтон и т. п.). Индустриальное питание дало большие удобства населению и сверхприбыли производителям, однако привело к неблагоприятным для здоровья населения последствиям. Масштабное рафинирование исходных живых продуктов, превращающее их в безжизненные элементы, введение консервантов, разнообразных пищевых красителей, наполнителей и т. п., удаление оболочек, содержащих витамины и ферменты, обработка свежих фруктов антибиотиками и покрытие их воском для увеличения срока хранения, добавление в пищу птице и скоту антибиотиков и анаболических гормонов – вот далеко не полный список бед индустриального питания. На ошибочность такой позиции указывал академик А. М. Уголев (1992).Разбалансированность рациона, дефицит витаминов и биологически активных веществ приводят к развитию болезней «адаптации» (ожирение, гипертония, диабет, рак и др.) и как следствие – увеличение смертности и снижение продолжительности жизни.


Растущее недовольство системой индустриального питания, осознание его роли в развитии «болезней цивилизации» привели к формированию новых систем и способов питания объединенных в общее понятие «нетрадиционное или альтернативное питание».


К основным видам альтернативного питания относят:
раздельное питание
концепция главного пищевого фактора
вегетарианство
концепция питания предков
концепция «мнимых» лекарств
теория адекватного целебно-видового питания по Шаталовой
система питания по Ниши
питание в системе учения йоги
питание в дзенмакробиотике
аюрведическое питание
голодание лечебное или профилактическое


Варианты альтернативного питания имеют ряд положительных моментов, в то же время не лишены недостатков.


Теория раздельного питания строго регламентирует совместимость и несовместимость пищевых продуктов. Ее основатель американский диетолог Герберт Шелтон (1895-1985) объясняет это особенностями пищеварения в желудке. В частности, белки перевариваются под воздействием ферментов только в кислой среде в нижнем отделе желудка, а углеводы – в верхних его частях под воздействием ферментов слюны в щелочной среде. В кислой среде желудка активность ферментов слюны угнетается, и переваривание углеводов прекращается. Критика: основной процесс пищеварения происходит не в желудке, а в кишечнике; состав ферментов пищеварительного сока обеспечивает переваривание многокомпонентной пищи; в природе не существует продуктов, состоящих только из белков, жиров или углеводов, как правило они содержат множество питательных веществ; против концепции раздельного питания свидетельствует многовековой опыт кухни ародов мира, сочетающий принцип разнообразия питания с разумным потреблением пищевых продуктов.


Концепция главного пищевого фактора отдает предпочтение какому-то одному или нескольким пищевым компонентам. Внутри этой концепции существуют несколько течений.


Японское учение макробиотиков («макробиот» с греч. – «долгожитель») главным считает правильное соотношение в рационе натрия и калия и преобладание щелочных эквивалентов при исключении из питания продуктов, богатых кислыми эквивалентами.


Д. Джарвис в книге «Мед и другие естественные продукты» (1981) провозглашает в качестве универсального лечебного и профилактического средства мед и яблочный уксус. Жизненную силу последнего он видел в высокой концентрации калия. В противовес макробиотикам Джарвис рекомендует преимущественное содержание в пище кислых эквивалентов.


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


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


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


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


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


В основе концепции питания предков лежат особенности питания древнего человека. Проповедники этого направления подразделяются на сыроедов и сухоедов.


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


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


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


Сторонники концепции «мнимых» лекарств находят в отдельных продуктах особые целебные свойства. На этом основании данный продукт или вещество необоснованно превозносится и рекламируется. Использование таких продуктов рекомендуется при всех заболеваниях без исключения и для всех людей. В качестве примеров можно привести модные увлечения проросшими семенами, перепелиными яйцами, уринотерапией, гидролизатами АУ-8 и И-1 и т. д. Однако человеческий организм слишком сложен, и вряд ли можно существенно повлиять на согласованную деятельность его органов и систем каким-либо одним продуктом или веществом, даже если оно содержит в себе весьма полезные свойства.


В последнее время особой популярностью стала пользоваться теория адекватного целебно-видового питания, разработанная Г. С. Шаталовой (1997) – своеобразный по набору продуктов вариант питания растительной пищей с минимальной тепловой кулинарной обработкой и элементами раздельного питания. Эта система питания вобрала в себя такие крайние положения нетрадиционного питания, как уринотерапию, «биоинформационные свойства» сырой растительной пищи, образование белка в организме человека за счет усвоения азота атмосферного воздуха, непосредственное получение энергии человеком не только из пищи, но и из источников окружающей среды, в том числе из Космоса, вред Хлеба и молока, наличие структурированной воды во фруктах и овощах. По мнению Шаталовой, здоровый человек должен пережевывать каждую порцию пищи не менее 50 раз, самосовершенствующийся человек – 150 раз, а больной – 200 раз. Во что превратится тогда каждая трапеза? Особенно негативным является предложение автора снизить потребление человеком энергии пищи (жиры, белки, углеводы) примерно в три раза, так как биоинформационные свойства некоторых продуктов, энергия окружающей среды и азот воздуха, перерабатываемый микробами кишечника в аминокислоты, способны в значительной мере восполнить потребности человека.


Наиболее приемлемой с точки зрения здравого смысла является система здоровья Ниши. Этим японским автором сформулированы правила полноценного питания, способствующие долголетию и здоровью:


1. Пейте пресную хорошего качества воду до 2,5-3 литров ежедневно.


2. Ешьте в основном естественные продукты: фрукты, орехи, овощи, зелень, семечки – до75 % своего ежедневного рациона.


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


4. Тщательно разжевывайте пищу. Помните: хорошо пережеванное – наполовину переваренное.


5. Ешьте только в том случае, если голодны. Лучше пропустить прием пищи, заменив ее водой. Вода – это еда.


6. Еженедельно 24-36 часов давайте отдых своим системам. Перед голоданием обязательно очистите кишечник настоем трав или клизмой.


7. Не ешьте до полудня и заканчивайте прием пищи в 18 часов: пусть завтрак будет поздним, а ужин ранним.


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


Принципы осознанного питания:


1. Приучите себя постоянно пить очищенную сырую воду по 2-3 л в день.


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


3. ешьте только при ощущении голода. Чтобы не перепутать чувство голода с аппетитом, за 30 мин до еды приучите себя выпивать по 200 мл очищенной воды.


4. Старайтесь не пить во время еды. Вода уходит из желудка через 10 мин после ее приема, унося с собой разбавленный желудочный сок., что препятствует пищеварению. Питье во время еды ведет к плохому пережевыванию пищи. Необходимо пить воду через 30 мин после приема фруктов, через 2 часа после крахмальной пищи и через 4 часа после белковой.


5. Приучите себя не употреблять слишком холодные или горячие напитки и блюда. Холод прерывает действие энзимов, а горячая пища нарушает тонус пищеварительных органов.


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


7. откажитесь от всех рафинированных продуктов: мука, очищенный рис, хлопья, перловка, сахар и продукты, в которых он присутствует. Вместо промышленного очищенного сахара рекомендуется употреблять желтый нерафинированный сахар, мед, сухофрукты, сладкие фрукты и овощи.


8. Обязательно введите в ежедневный рацион естественную сырую пищу – овощи, семена, орехи, семечки, фрукты.


9. Летом и осенью ежедневно, а зимой два-три раза в неделю начните день с фруктов и овощей как самостоятельного приема пищи. Желательно добавить два-три грецких ореха. Свежие фрукты полезнее сушеных.


10. Обязательно съедайте в обед одну большую порцию салата. Листья салата незаменимы в биологической диете человека. Зеленые листья поставляют организму сложные белки, витамины, многие щелочные соли, особенно железо и кальций в легко усвояемой форме. Салаты должны быть сырыми, состоять не более чем из четырех овощей, употреблять без соли, уксуса, масла, лимонного сока или других приправ. Применяются для таких блюд: капуста, зеленые листья салата, сельдерей, огурцы, редис, лук. Помидоры, кресс-салат, петрушка.


11. Употребляйте животные жиры в умеренном количестве, они тормозят пищеварение, особенно усвоение белков, увеличивая тем самым брожение в желудочно-кишечном тракте. А это ведет к перегрузке печени и почек токсинами. Жиры нежелательно употреблять вместе с белками – молоком, рыбой, орехами. Жиры следует добавлять в пищу только после ее приготовления. Соотношение животных и растительных жиров должно составлять 1:3.


12. Если вы вынуждены принимать вареную (ненатуральную) пищу, обязательно сочетайте ее с сырыми овощами. При этом сырых продуктов должно быть в 2-3 раза больше, чем вареных.


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


14. Работа систем нашего организма требует кратковременного перерыва, или «санитарного» часа. Далеко не каждый согласен с этим, хотя даже у тех, чей желудок работает 2-3 часа в день, на стенках толстой кишки накапливается от 3 до 25 кг отложений.


15. Не принимайте избыточное количество пищи, так как это ведет к перегрузке организма и его принудительной работе. Насилие над природой всегда приводит к губительным последствиям.


16. Уменьшите употребление поваренной соли, а при сердечно-сосудистых заболеваниях исключите ее вовсе. В поваренной соли всего два микроэлемента – хлор и натрий, в то время как в морской соли их более 64, и все они необходимы организму человека. Такие овощи, как чеснок, лук, черемша, хрен, редька (их корни и зелень), прекрасно дополняют комбинации всех природных солей и могут служить заменителем поваренной соли. Морская капуста также может использоваться для присаливания пищи. Вместо соли можно приготовить гаммасио: 1 часть помола морской соли смешивают с 12 частями молотого (в кофемолке) кунжутного или льняного семени, получают прекрасный продукт, обогащающий супы и салаты (присучивают готовые блюда на столе).


Положения, которые легли в основу теории осознанного питания:


XX век внес коренные изменения как в образ жизни, так и в структуру питания человека. В частности, резко сократились энергозатраты, и в большинстве экономически развитых стран в настоящее время они достигли критического уровня (около 2,2 – 2,5 тыс. ккал). Человеку нет необходимости в повседневных условиях заниматься тяжелым физическим трудом и тратить много энергии. Следовательно, калорийность рациона должна быть резко снижена, в первую очередь за счет мяса и животных жиров. Одновременно необходимо повысить содержание в рационе витаминов, макро- и микроэлементов, органических кислот, фитонцидов и пектиновых веществ, клетчатки.


Вместе с тем, потребление мяса и жиров среди населения развитых стран возрастает год от года. Сегодня средний американец получает 70% белков животного происхождения, в то время как в начале столетия более половины белков, употребляемых с пищей, были растительными. Более 60% калорий потребляется из жиров и рафинированного сахара и лишь 20% - из овощей, цельного зерна и фруктов.


Как показывают статистические и клинические исследования, по белкам, жирам и углеводам рацион современного человека укладывается в норму и даже перекрывает ее. Зато по набору и количеству макро- и микроэлементов, витаминов и других физиологически активных веществ, содержащихся в растениях, далеки от нее. Вот почему микроэлементозы и гиповитаминозы сегодня стали столь распространены.


В США с 1964 г. произошло снижение потребления клетчатки на 42%, что связано с уменьшением потребления растительной пищи. Взамен этому значительно возросла роль рафинированных продуктов. Классическим примером может служить обычный рафинированный сахар, который из ценнейшего продукта питания превратился в «пищевой мусор». Известно, что в желтом неочищенном сахаре содержатся наряду с сахарозой (количество которой не больше 25%)другие углеводы – арабиноза, раффиноза, а также витамины и микроэлементы. При его рафинировании все составные части, кроме сахарозы, остаются в патоке, то есть становятся отходами. В итоге сахар-рафинад не имеет никакой другой ценности, кроме энергетической, он становится безжизненным. В то же время желтый сахар оказывает общеукрепляющее, противодиабетическое, антисклеротическое, мочегонное, противовоспалительное действие, понижает кровяное давление, регулирует обмен углеводов и жиров, снижает возможность появления кариеса. Между прочим, знаменитые восточные сладости в древности представляли собой не что иное, как выпаренный сок бананов сахарного тростника, различных пальм и т. д.


Ценность пищевых продуктов отчасти теряется при неправильной переработке и консервации. В процессе кулинарной обработки теряется в среднем 10% энергетической ценности продуктов, до 60% витамина С, 20-30% витаминов группы В, до 45% витамина А, потери кальция достигают 15%, железа – 20%.


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


Развитие сельского хозяйства и искусственная обработка земель привела к тому, что ряд минералов почти исчезли из почвы. Концентрация минеральных элементов в растениях постоянно снижается. По данным США, содержание железа во фруктах снизилось на 57%, магния – на 35%, кальция в зелени – на 46,4%. Капуста потеряла 85% кальция, пшеница – 46%.


Человек современного урбанизированного общества при традиционном питании по существу обречен на те или иные виды пищевой недостаточности.


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


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


Осознанное питание пока остается идеалом для большинства людей, так как преобладает индустриальное питание.


Мировое научное сообщество полагает, что одним из эффективных, экономически обоснованных и быстрых путей решения этой проблемы является включение в рацион питания биологически активных пищевых добавок.


В 1975 году на специальной сессии медико-биологического отделения АМН СССР было обсуждено выделение особой группы соединений, которые способны оказывать выраженный физиологический эффект в минимальных количествах. Они были объединены под названием биологически активных веществ или микронутриентов. К ним были отнесены алкалоиды, гормоны и гормоноподобные соединения, витамины, микроэлементы, биогенные амины, нейромедиаторы, вещества, обладающие фармакологической активностью. Большинство микронутриентов содержится в обычных пищевых продуктах (А. А. Покровский, 1979). Многие из них присутствуют в продуктах питания в равных а иногда и в более высоких дозах, чем дозы, установленные фармакопеей (И. И. Брекман, 1980). Физиологический эффект который способны оказывать минронутриенты пищи на многие функции и реакции организма, вполне сопоставим с эффектом фармакологических препаратов , И, Брекман, 1980).


Таким образом, на стыке фармакологии и диетологии появилось новое направление медицины – микронутриентология, основной задачей которой является обоснование, создание и профилактическое применение микронутриентов различной природы и строения (Гичев Ю. П., Оганова Э., 1998). В 1999 г. Тутельян В. А, с соавторами предложили другой термин для новой отрасли медицины – фармаконутрициология. Предложено также называть микронутриенты биологически активными добавками к пище (БАД). Эта терминология и стала в настоящее время общеупотребимой.


Предпосылки для развития нутрициологии:


1. Успехи собственной нутрициологии, расшифровавшей роль нутрициологии и значение для жизнедеятельности человека отдельных пищевых веществ, включая так называемые микронутриенты, и доказавшей, что в экономически развитых странах достижение оптимальной обеспеченности всех групп населения энергией и пищевыми веществами практически возможно лишь при широком использовании БАД.


2. Биологически активные добавки к пище (БАД) – это природные или аналогичные природным фармакологические комплексы, которые необходимы для обеспечения физиологически оптимального функционирования человеческого организма и которые современный человек недополучает с пищей.


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


БАД по своей природе могут быть продуктами растительного, животного, минерального, микробного происхождения или имеют комбинированный состав. Они позволяют восполнять алиментарные дефициты современного человека и пополнять его рацион необходимыми организму витаминами, минеральными веществами, микроэлементами и растительными волокнами и другими ингредиентами.


БАД являются отдельной группой лекарственных веществ.


Медицинская практика свидетельствует о том, что биологически активные вещества растительного и животного происхождения, входящие в состав БАД, обладают целым рядом преимуществ перед синтетическими и монокомпонентными лекарственными средствами, и поэтому они предпочтительны.


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


Отличие БАД от пищи заключается в том, что потребление с пищей необходимых элементов трудно контролировать как в количественном, так и в качественном отношении. К тому же современная пища не в состоянии обеспечить организм всеми необходимыми биологически активными веществами в необходимых количествах. Например, чтобы восполнить потребность организма в витамине С, необходимо ежедневно съедать по ведру яблок, 4-5 лимонов или 1,5-2 кг моркови, что нереально. Содержание же необходимых организму элементов в БАД заранее известно и строго контролируется, их количественное содержание в пределах срока годности и при соблюдении условий хранения не изменяется. Суточная потребность в нутрицевтиках удовлетворяется, как правило, 2-6 капсулами или таблетками.


БАД часто путают с пищевыми добавками. Пищевые добавки – это химические вещества и природные соединения, которые сами по себе не употребляются в пищу, а добавляются в нее для улучшения качества сырья и готовой продукции. Известны следующие виды пищевых добавок:
консерванты – удлиняют срок хранения пищи
красители
ароматизаторы
загустители, желирующие вещества
эмульгаторы – для лучшего взбивания сливок, майонеза, мороженного и т.п.
антиоксиданты – предотвращение окисления жира при его хранении (лигнин в сливочном масле)
ферменты – ускорение технологического процесса при производстве пищевых продуктов
наполнители – увеличивают объем продукта, не увеличивая питательных свойств, например, при производстве колбас
поглотители – препятствуют слеживанию муки, сахара и др. продуктов.


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


БАД широко применяются в мире. Благодаря этому в Японии, где БАД применяются более 50 лет, самая высокая в мире продолжительность жизни. По данным Института питания РАМН, поливитаминные препараты ежедневно принимает не более 3% населения России, в то время как в Европе – не менее 50%, в США – 80%.


БАД принято делить на нутрицевтики и парафармацевтики. Такое деление в значительной мере является условным, так как БАД представляют собой в основном комплексные препараты с функциями и нутрицевтиков, и парафармацевтиков.


Нутрицевтики – эссенциальные компоненты пищи. К ним относят белки и аминокислоты, полиненасыщенные жирные кислоты (ПНЖК) и фосфолипиды, углеводы, витамины, микроэлементы, пищевые волокна. Роль нутрицевтиков заключается в поддержании здоровья, первичной и вторичной профилактике, а также комплексном лечении многих заболеваний и в первую очередь «болезней цивилизации» (Тутельян В. А., соавт., 1999).


Белки и аминокислоты выпускаются в виде полноценных пищевых смесей, содержащих высокие концентрации молочных, яичных, соевых, дрожжевых белков усвояемостью не менее 95% в оптимальном соотношении. Эти смеси с добавками других компонентов используются для обогащения белком арциона практически здоровых людей, а также в детском питании, питании пожилых людей, для спортсменов, для зондового питания, при хронических заболеваниях печени, при функциональных нарушениях ЦНС, при сосудистой патологии и т.п.


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


Углеводы (полисахариды) выпускаются в виде смесей, таблеток, порошков, криопорошков, гранул, капсул. Им придается большое значение в профилактике заболеваний ЖКТ, желчнокаменной и мочекаменной болезни, атеросклероза и др.


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


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


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


Функциональная роль нутрицевтиков:


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


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


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


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


5. усиливают и ускоряют связывание и выведение чужеродных и токсичных веществ из организма;


6. направленно изменяют обмен отдельных веществ путем воздействия на ферментативные системы метаболизма.


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


Парафармацевтики – это лекарственые средства натурального происхождения, имеющие направленное фармакологическое действие и применяющиеся по показаниям для профилактики и лечения практически всех заболеваний. Действие парафармацевтиков направлено на активацию и стимуляцию функций отдельных органов и систем в пределах физиологических границ (например, стимуляция секреторной или моторно-эвакуаторной функции ЖКТ. Стимуляция умственной и физической работоспособности адаптогенами, регуляция обмена веществ и др.)


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


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


Одним из важнейших, если не единственным критерием отличия парафармацевтиков от лекарств является количественная оценка конечного результата: если регуляция или стимуляция функций осуществляется в границах нормы – это БАД. Если ответная реакция выходит за границы нормы – это лекарство.


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


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


Практически здоровым лицам парафармацевтики, как правило не назначаются.


Таким образом, клиническая эффективность нутрицевтиков и парафармацевтиков различна. Нутрицевтики восполняют дефицит определенных макро- и микронутриентов в организме человека – белков, жиров, углеводов, витаминов. Микроэлементов, и скорее являются средствами профилактики. А парафармацевтики за счет содержания минорных компонентов пищи – биофлавоноидов, сапонинов и многих других – обладают выраженной фармакологической активностью.

Как правильно выбрать нижнее белье

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

Хотя парадокс заключается в том, что мужчин больше интересует не то, что надето на желанной подруге, а как раз то, что находится под столь тщательно выбранным бельем. Тем не менее, попробуем пройти небольшой ликбез по выбору дамского белья, который может пригодиться прелестницам при покупке, а их спутникам - при приобретении подарка.
Из какого материала?

К выбору материала следует подойти особенно трепетно и внимательно, ведь оно практически круглые сутки соприкасается с самыми интимными частями тела и может вызвать раздражение чувствительной кожи или аллергическую реакцию. Чтобы телу было комфортно, чтобы кожа «дышала», на каждый день лучше выбирать белье из натуральных материалов. Это может быть хлопок, шелк, их сочетание с умеренным добавлением эластана, вискозы или полиэстера.

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

Как правильно подобрать размер?

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

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

Интересно, что не все согласны с имеющейся системой определения размеров. Так, исследователи из Гонконгского политехнического университета вывели новую математическую формулу расчета размеров бюстгальтеров вместо существующей практики. Они предложили учитывать восемь ключевых замеров вместо измерения двух обхватов, т.к. «геометрия женской груди очень сложна и должна измеряться в трехмерном пространстве». По их мнению, число размеров бюстгальтеров необходимо увеличить для удобства прекрасной половины человечества. Вот уж поистине заботливые мужчины!

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

Для выбора трусиков нужно всего лишь навсего измерить обхват бедер.

Какой цвет и фасон выбрать?

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

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