CITKIT.ru
3 терабайта свободного софта!
Logo    
IT-рынок Новости мира IT Океан(!) софта на CITKIT.ru Форумы Поступления в библиотеку Учебный центр Курилка
CitForum    CITForum на CD Море(!) аналитической информации! :: CITFORUM.RU
IT-консалтинг Software Engineering Программирование Open Source СУБД Безопасность Internet Сети Операционные системы Hardware

23.05.2005

Google
WWW CITForum.ru

Новости мира IT:

  • 11.05 - Intel создает свою группу по Open Source
  • 11.05 - Банк контролирует использование USB устройств при помощи DeviceLock
  • 11.05 - Microsoft устранила опасную дыру в Windows
  • 11.05 - "Корпорация ОСС" создает антимонопольный альянс операторов IP-телефонии
  • 11.05 - В Mac OS X найдены множественные уязвимости
  • 11.05 - "Билайн" запускает услугу "Мобильная почта"
  • 11.05 - Две критические уязвимости в браузере Firefox 1.0.3
  • 11.05 - IBM покупает начинающую Open Source-компанию Gluecode
  • 11.05 - Microsoft готова к битве с Open Source за школы
  • 11.05 - Sun завершит "открытие" Solaris в ближайшие 45 дней
  • 11.05 - Создатели браузера Firefox выпускают юбилейные монеты в честь 50 миллионов скачанных копий
  • 11.05 - Вышла пятая версия мобильной ОС от Microsoft
  • 11.05 - Поисковые движки умнеют быстрее, чем люди
  • 11.05 - Фишеры постоянно совершенствуются
  • 11.05 - Специалисты прогнозируют появление аналога Google Adsense от "Яндекс"
  • 06.05 - ICANN озаботилась проблемой торговых марок
  • 06.05 - Google патентует сортировку новостей
  • 06.05 - Intel готовит двуядерные процессоры второго поколения
  • 06.05 - Schoolforge-UK и OSC продвигают Open Source в школы
  • 06.05 - Новая версия рекламной программы подстрекает пользователей купить ПО для своего лечения
  • 06.05 - Microsoft продает ряд своих закрытых разработок
  • 06.05 - Google Labs анонсировал ускоритель интернета
  • 06.05 - Microsoft подвешивает пиратам "морковку"
  • 06.05 - В США входят в обиход "интеллектуальные" тележки для супермаркетов
  • 06.05 - Microsoft работает над аналогом PDF
  • 05.05 - Yahoo video search теперь доступен массам
  • 05.05 - Алмазы помогут бороться с хакерами
  • 05.05 - Интернет-охоту хотят запретить
  • 05.05 - Microsoft привлекает блоггеров для теста Longhorn
  • 05.05 - Основатель Red Hat предложил Стиву Джобсу помощь в решении проблемы с торговой маркой
  • 05.05 - Компьютерная система оргкомитета Кубка мира по футболу 2006 года пострадала от червя Sober
  • 04.05 - Cisco Systems представила многофункциональный продукт Adaptive Security Appliance 5500
  • 04.05 - Администрация Евросоюза поддержала идею всеевропейской интернет-библиотеки
  • 04.05 - Компьютерный вирус дарит билеты на чемпионат мира по футболу
  • 04.05 - Лаборатория Касперского: Обзор вирусной активности - апрель 2005
  • 04.05 - Microsoft хочет отсудить у россиянина два домена
  • 04.05 - Сделка между Lenovo и IBM завершена
  • 04.05 - Эпидемия червя Sober.p зафиксирована в Западной Европе
  • 04.05 - Panda Software публикует отчет о вирусной активности за апрель
  • 03.05 - Институт SANS обновил список наиболее опасных уязвимостей

    Архив новостей >>>


  • 2003 г

    Java и Oracle - это очень просто

    © Владимир Пржиялковский,
    координатор Евро-Азиатской Группы Пользователей Oracle,
    преподаватель УКЦ Interface Ltd.

    Содержание

    Основные понятия

    Начиная с версии 8.1 в состав СУБД Oracle можно дополнительно включать так называемый JServer, позволяющий использовать для хранимых процедур помимо PL/SQL еще и язык Java. В состав JServer входят следующие элементы:

    • виртуальная Java-машина JVM под названием Aurora, поддерживающая среду для выполнения Java-программ и библиотеки классов Java
    • средства увязки с PL/SQL
    • ряд других

    JVM Aurora способна исполнять методы Java ("хранимые Java-процедуры") и классы, хранимые в Oracle.

    В версии 9.0 JServer переименован в Oracle9i JVM (иногда - OJVM или же Enterprise Java Server).

    Место Java в архитектуре Oracle

    Наличие встроенной виртуальной машины Java в Oracle -дополнительная возможность по отношению к базовой поставке.

    Начиная с версии 9.2 встроенная в СУБД виртуальная машина Java не поддерживает магазины протоколов J2EE и CORBA. В частности, с этого времени нет возможности разместить в БД под управлением Oracle контейнеры для EJB, JSP и сервлетов (OSE), как это было раньше. Их предлагается размещать в среде OC4J из состава Oracle 9i Application Server. Встроенная машина Java продолжает поддерживать только работу хранимых процедур, JDBC и SQLJ.

    Соотношение и взаимосвязь PL/SQL и Java в Oracle

    Java в Oracle представляет собой полнофункциональную замкнутую систему, однако классы Java средствами Oracle можно "публиковать" для PL/SQL-машины и вызывать из программ на PL/SQL.

    Вплоть до версии 9.2 включительно PL/SQL в Oracle несравнимо эффективнее отрабатывает SQL-запросы. С другой стороны Java обладает более богатой и универсальной языковой средой для описания приложений.

    Особенности Java и среда работы программ на Java

    Архитектура и принципы работы Java резко отличаются от архитектуры и принципов работы PL/SQL. Ниже излагаются некоторые особенности Java, существенные для использования этого языка при работе с Oracle.

    Программные компоненты в среде разработки на Java

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

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

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

    Установка среды разработки на Java

    Для ведения разработок с использованием Java необходимо установить на компьютере JDK (Java Development Kit, прежнее название - SDK, Software Development Kit for Java).

    Начиная с версии Oracle 8.1 JDK присутствует на CD с основной поставкой и может устанавливаться штатной программой Oracle Installer путем специального указания. В типовых вариантах установки программной среды Oracle (например, в вариантах Typical или Minimal в версиии 8.1) JDK появляется на компьютере автоматически.

    JDK можно установить и независимо от Oracle, переписав этот программный комплект с http://www.javasoft.com/products/.

    Среда окружения OC

    Для работы программ среды разработки Java должны быть выставлены следующие минимально необходимые переменные среды окружения ОС:

    • CLASSPATH. Переменная, которая указывает на местонахождение файлов с классами, необходимыми для трансляции или выполнения java-программы. Местонахождением может быть (а) каталог файловой системы, в котором расположены файлы с классами и (б) zip- или jar-файл с теми же файлами, упакованными внутрь. Путь к файлу с классом должен быть согласован с полным именем класса, включающим имя пакета. Если имя пакета не используется, в CLASSPATH следует включить "." (указание на текущий каталог). (Строго говоря, для работы программ java и javac переменную CLASSPATH можно и не выставлять, но тогда эти программы обязаны использовать ключ -classpath, иначе не обязательный.)
    • PATH. Сюда нужно включить доступ к программам среды разработки.

    Исполняемые модули из состава JDK в версии 8.1 расположены в %ORACLE_HOME%\apache\jdk\bin, а в версии 9 - в %ORACLE_HOME%\ jdk\bin.

    Основные библиотеки классов classes111.zip и classes12.zip (разница между ними - в версиях Java) в обеих версиях Oracle находятся в %ORACLE_HOME%\jdbc\lib

    Для проведения экспериментов удобно создать командный файл со следующим текстом для версии Oracle 8.1:

    set nls_lang=american_america.ru8pc866
    set oracle_home=c:\oracle\ora81
    set classpath=%oracle_home%\jdbc\lib\classes111.zip;.
    path=%path%;%oracle_home%\apache\jdk\bin;%oracle_home%\lib

    или со следующим текстом для версии Oracle 9.2:

    set nls_lang=american_america.ru8pc866
    set oracle_home=c:\oracle\ora92
    set classpath=%oracle_home%\jdbc\lib\classes111.zip;.
    path=%path%;%oracle_home%\jdk\bin

    Теперь можно открыть консольное окошко и прогнать нужный командный файл.

    Создание самостоятельных программ на Java

    Пример транслирования и выполнения Java-программы

    Файл с программой под названием MyJavaAgent.java может иметь следующее содержание:

    public class MyJavaAgent {
         public static String sayHello (String toWhom) {
              return "Hello, " + toWhom + "!";
         }
         public static void main(String[] args) {
              System.out.println(sayHello("World"));
         }
    }

    Транслирование программы (класса):

    javac MyJavaAgent.java

    Запуск программы (класса):

    java MyJavaAgent

    Создание хранимых программ на Java в Oracle

    Oracle позволяет хранить Java-программы и вызывать их на исполнение с помощью встроенной JVM, полностью наподобие хранимым PL/SQL-процедурам, исполняемым встроенной PL/SQL-машиной.

    Дополнительные компоненты СУБД Oracle для работы с хранимыми Java-программами

    Для работы с хранимыми Java-программами посредством Jserver/OJVM в Oracle добавлены следующие компоненты разного характера:

    Компонента
    Описание
    JVM Aurora/Oracle JVM Java Virtual Machine, выполняющая хранимый Java-код
    loadjava Программа, вызываемая из операционной системы для загрузки в БД Java-элементов из файлов .java, .class, .properties, .jar, .zip, .sqlj
    dropjava Программа, вызываемая из операционной системы для удаления из БД ранее загруженных Java-элементов
    CREATE JAVA SYSTEM Создает в БД структуры для работы Java; аналогична SQL-предложению заведения БД CREATE DATABASE …
    {CREATE | ALTER | DROP} JAVA … SQL-предложения категории DDL, во многом дублирующие функции программ loadjava и dropjava
    Модификации в CREATE PROCEDURE/FUNCTION … Позволяют предъявлять хранимые Java-программы в зону видимости PL/SQL-программ
    JAVA_POOL_SIZE
    JAVA_MAX_SESSIONSPACE_SIZE
    JAVA_SOFT_SESSIONSPACE_LIMIT
    INIT-параметры, регулирующие использование памяти Java-программами в Oracle
    JAVASYSPRIV
    JAVAUSERPRIV
    Роли, которые дают возможность хранимым программам взаимодействовать с операционной системой (например, читать из файла)
    DBMS_JAVA Системный пакет с процедурами и функциями для работы с Oracle JVM (большей частью - внутреннего пользования)
    DBMS_JAVA_TEST Системный пакет для отладки хранимых процедур
    Jpublisher Средство построения классов Java на основе объектных типов и типов REF в Oracle


    В зависимости от характера перечисленных компонент они заводятся либо при установке программноый среды работы Oracle, либо при создании в БД среды JServer/OJVM.

    Схема вызова хранимых Java-программ

    Хранимым Java-программам в Oracle соответствуют методы Java, подверженные следующим ограничениям (версия 8.1):

    • методы, публикуемые для использования в SQL или PL/SQL, должны быть объявлены как статические
    • классы не могут делать во время исполнения обращений к GUI-классам (например, к awt)

    Установка JServer/OJVM в версиях 8.1 и 9

    Проще и короче всего установить JServer/OJVM в виде побочного следствия установки одной из стандартных конфигураций программной среды Oracle (например, Typical или Minimal в версии 8.1).

    Тем не менее, JServer/OJVM можно доустановить к имеющейся программной среде, если он отсутствовал ранее, путем запуска сценария initjvm.sql из каталога %ORACLE_HOME%\javavm\install (система обозначений Windows).

    Пример создания хранимой Java-программы

    Хранимые Java-программы могут создаваться в БД под Oracle двумя способами:

    • загрузкой извне с помощью программы loadjava и
    • SQL-предложением CREATE/ALTER JAVA …

    Ниже показаны оба способа на примере класса, создаваемого в рамках пакета training.demos.

    Создание с помощью loadjava

    Пусть в каталоге training/demos имеется файл MyJavaAgentInOracle.java (имеет отличия от файла MyHi.java, приведенного выше):

    package training.demos;public class MyJavaAgentInOracle {
                         public static String sayHello (String toWhom) {
           
    return "Hello, " + toWhom + "!";
            }
    }

    Загрузка в схему SCOTT БД текста кода для класса в этом файле (система обозначений Windows; в Unix-оболочках аналогично):

    set CLASSPATH=%CLASSPATH%;%ORACLE_HOME%\javavm\aurora.zip

    (в версии 9 %CLASSPATH%;%ORACLE_HOME%\javavm\lib\aurora.zip)

    loadjava -user scott/tiger -o training/demos/MyJavaAgentInOracle.java

    Если в том же каталоге у нас будет странслированный программой javac класс MyHiFromOracle, можно будет загрузить в БД сразу его:

    loadjava -user scott/tiger -o training/demos/MyJavaAgentInOracle.class

    Создание SQL-предложением

    Загрузить код того же класса можно по-другому:

    CREATE JAVA SOURCE NAMED "training/demos/MyJavaAgentInOracle" AS
    public class MyJavaAgentInOracle { public static String sayHello (String toWhom) {         return "Hello, " + toWhom + "!";
          }
    };
    /

    Обращение к загруженной в Oracle процедуре Java

    Обращение к Java-программе из Java-кода делается как обычно.

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

    CREATE FUNCTION say_hello_from_java_to (to_whom IN VARCHAR2)
          RETURN VARCHAR2
    AS LANGUAGE JAVA
    NAME 'training.demos.MyJavaAgentInOracle.sayHello (java.lang.String)
          return java.lang.String';

    /

    После этого можно выполнить в SQL*Plus:

    SET SERVEROUTPUT ON
    EXEC DBMS_OUTPUT.PUT_LINE(say_hello_from_java_to('World'))

    Работа со словарем-справочником

    Организация справочной информации

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

    При первой загрузке программных элементов Java в любую схему loadjava или команда CREATE JAVA создадут там:

    • CREATE$JAVA$LOB$TABLE - таблицу для хранения кода Java-программ
    • JAVA$CLASS$MD5$TABLE - хеш-таблицу для хранения цифровых подписей (digest) для каждого загружаемого объекта (с целью учета необходимости перетранслировать предъявляемый объект)
    • Несколько вспомогательных объектов, играющих вместе с этими двумя таблицами роль своеобразного "словаря-справочника программных элементов Java" в конкретной схеме.

    Фактически загрузка программой loadjava вызывает неявную выдачу команды CREATE JAVA … . Описание программных элементов Java заносится в таблицу CREATE$JAVA$LOB$TABLE. Повторная загрузка одного и того же Java-элемента реально выполняться не будет, если только (а) он не изменил свое описание или (б) не указан ключ -force при вызове программы loadjava.

    Просмотр Java-элементов

    Java-объекты, заведенные в схеме, можно просмотреть из таблицы USER_OBJECTS словаря-справочника обычным способом:

    COLUMN object_name FORMAT A30
    SELECT object_name, object_type, status, timestamp
    FROM user_objects
    WHERE object_name NOT LIKE 'SYS_%' AND
                     object_name NOT LIKE 'CREATE$%' AND
                     object_name NOT LIKE 'JAVA$%' AND
                     object_name NOT LIKE 'LOADLOB%' AND
                  object_type LIKE 'JAVA %'
    ORDER BY 2, 1;

    Просмотр исходных текстов

    Выгрузить из БД исходные тексты из "словаря-справочника объектов Java" конкретной схемы можно с помощью процедур пакета DBMS_JAVA:

    DECLARE
      PROCEDURE put_java_source(jclass IN VARCHAR2) IS
        b CLOB;
        v VARCHAR2(4000);
        i INTEGER := 4000;
      BEGIN
        DBMS_LOB.CREATETEMPORARY(b, FALSE);
        DBMS_JAVA.EXPORT_SOURCE(jclass, b);
        DBMS_LOB.READ(b, i, 1, v);
        DBMS_OUTPUT.PUT_LINE(v);
      END;
    BEGIN
    put_java_source('training/demos/MyJavaAgentInOracle');
    END;
    /

    Исходные тексты программ на Java в БД модно посмотреть также в консоли Oracle Enterprize Manager или в аналогичных системах третьих фирм.

    Преобразование имен

    Стандарт именования классов в Java допускает более длинные имена, чем предел в 30 знаков в SQL Oracle. Достаточно длинные Java-имена Oracle при помещении в словарь-справочник самостоятельно заменяет на придуманные более короткие. Получить первоначальное имя по присвоенному Oracle можно с помощью функции DBMS_JAVA.LONGNAME. Пример ее использования:

    COLUMN shortname FORMAT A30
    COLUMN longname FORMAT A60

    SELECT object_name shortname,DBMS_JAVA.LONGNAME(object_name) longname
    FROM user_objects
    WHERE object_type = 'JAVA CLASS';

    Кроме того, при помещении составного имени Java в БД Oracle переводит точки в знаки "/", например

    training.demos.MyHiFromOracle
    в
    training/demos/MyHiFromOracle.

    Дополнительная информация

    • Вы можете отправить свое мнение о материале его автору
    • Обратиться в Interface Ltd. за дополнительной информацией/по вопросу приобретения продуктов
    • Курсы по продуктам фирмы Oracle
    • Другие статьи по продуктам Oracle из рубрики "Мастерская Oracle"

    За дополнительной информацией обращайтесь в компанию Interface Ltd.
     


    ХАЙВЕЙ - лучший российский хостинг-провайдер: хостинг, регистрация доменов, услуга Ваша@почта, поддержка 24 часа


    NetPromoter - единственный российский профессиональный комплекс программ и сервисов для раскрутки сайта и интернет-статистики


    STSS - известный поставщик надежных серверных решений различного назначения на платформе Intel (Xeon) и AMD.


    5-55: the ITIL company. Практический опыт и теоретические знания на лучших семинарах по ITIL и процессам ITSM.


    Подписка на новости IT-портала CITForum.ru
    (библиотека, ftp-архив CITKIT.ru)

    Новые поступления в on-line библиотеку:

    28 апреля

  • Выбор первого дистрибутива Linux: Пособие для начинающих
  • Обфускация и защита программных продуктов
  • Анализ и оптимизация циклов с помощью производящих функций
  • Стратегии объектно-реляционного отображения: систематизация и анализ на основе паттернов

    26 апреля

  • Business Intelligence обещает значительный рост в 2005 году
  • Десять основных тенденций 2005 года в области Business Intelligence и Хранилищ данных
  • Управление эффективностью бизнеса и предсказуемость
  • Увеличение эффективности бизнеса: пять ошибок управления, которых следует избегать
  • Потребность в организационных данных: модель комплексного управления эффективностью бизнеса
  • Технология Хранилищ данных для государственных учреждений
  • Оцените, насколько совершенно ваше Хранилище данных

    21 апреля

  • Исполнение моделей при помощи виртуальной машины
  • Параллельные алгоритмы компьютерной алгебры
  • От стандарта до стандарта (о стандартизации оптических разъемов)
  • За штурвалом IP-станции

    Продолжение дискуссии читателей:

  • Линукс и пользователи, или что мне не нравится в Linux
  • Еще один взгляд на альтернативные ОС (и софт для них)
  • О некомпетентности пользователя Windows
  • Переписка Долгачева В.С. и Монахова В.В.

    19 апреля

  • Межпротокольный шлюз NAT-PT с функциями DNS-ALG и FTP-ALG для обеспечения взаимодействия между сетями IPv4 и IPv6
  • Рефакторинг архитектуры программного обеспечения: выделение слоев
  • Комбинаторика слов и построение тестовых последовательностей
  • Функциональное тестирование Web-приложений на основе технологии UniTesK

    14 апреля

  • Как организовать двойную парольную защиту данных в Oracle
  • Деревянный интерфейс

    Продолжение дискуссии читателей:

  • Microsoft против мира
  • Впечатления от прочитанного

    12 апреля

  • Крупные проблемы и текущие задачи исследований в области баз данных
  • Глава 2 из книги Т.Кайта "Oracle для профессионалов"Архитектура

    Дискуссия читателей о Linux и Windows:

  • Деньги правят миром, и у кого их больше, тот и прав!
  • О злокозненности некомпетентных пользователей, или почему я не люблю ограниченных пользователей Windows

    7 апреля

  • О доблести Билла Гейтса, или почему Windows лучше, чем LINUX или Mac OS
  • Витая пара - все ли так просто?!
  • Выбираем сервер печати
  • Один слой хорошо, а два - лучше (о пишущих DVD-приводах)

    5 апреля

  • Использование Caché SQL Gateway
  • Глава 19 из книги Т.Кайта "Oracle для профессионалов"Хранимые процедуры на языке Java
  • Что такое PostgreSQL?
  • Обновлен PostgreSQL FAQ

    31 марта

  • Использование Веб-сервисов в Caché
  • Защита на уровне строк (Oracle)
  • Секции в реальном мире

    29 марта

  • Разработка успешных приложений для Oracle - первая глава из книги Тома Кайта "Oracle для профессионалов"
  • Web-сервисы: растущие опасения (мнение аналитиков IDC)
  • Технология OLAP - мощная альтернатива электронным таблицам
  • Какой модной стала подготовка отчетности

    24 марта

  • Многоверсионность данных и управление параллельными транзакциями
  • Исключение из правил. Опыт разработки и внедрения финансовой корпоративной системы
  • Обнаружение компрометаций ядра Linux с помощью gdb
  • Корпоративная сервисная шина - "бюджетный" подход к решению задач интеграции
  • Сервис-ориентированная архитектура
  • Бизнес-процессы и XML

    22 марта

  • Доступно. И точка! (обзор точек беспроводного доступа)
  • Коммутаторы Fast/Gigabit Ethernet для "большой" сети
  • Push to Talk: нажми на кнопку и ...говори
  • Сети нового поколения и технология softswitch

    17 марта

  • Часто задаваемые вопросы о proxy (proxy FAQ)
  • Самонастраивающаяся база данных: управляемые приложения и настройка SQL
  • Еще раз о волоконных трассах
  • Настраиваем русский Unicode в FreeBSD-5.3.

    10 марта

  • Еще не сказанное о волоконной оптике
  • Wi-Fi на службе оператора
  • Пора менять платформу?
    (о сокетах LGA775 и PGA478)

    Oracle:

  • Детальный аудит для практических целей
  • Шифруем свои ресурсы данных

    3 марта

  • Требования к проекту. Классификация - первый шаг к пониманию
  • Gtk vs. Qt: драки не будет
  • Управление бизнесом "по максимуму": BPM для финансовых учреждений
  • Реализация решения по управлению эффективностью бизнеса
  • Новые SerialATA-винчестеры
  • Карман для сервера

    1 марта

  • Выбрать корпус - нет ничего проще?
  • Создание виртуальной сети с удаленной загрузкой узлов
  • Текущее состояние и перспективы развития рынка интеграционных технологий
  • Интеграция корпоративной информации: новое направление
  • Архитектурные подходы к консолидации

    24 февраля

  • Каждому проекту своя методология
  • Императив интеграции
  • Безопасность IP-телефонии - полевые зарисовки
  • О злокозненности Билла Гейтса, или почему я не люблю Windows

    22 февраля

  • Oracle10: шифруем данные
  • В версии Oracle10 "виртуальные частные базы данных" данных стали избирательнее
  • Каждому (пользователю) свое (данное в таблице)
    Часть 1
    Часть 2
  • Ускоряем интернет
  • Сетевая аутентификация на практике
  • В фокусе Microsoft Virtual Server 2005

    17 февраля

    Открыт новый раздел
    Все об Open Source

    Все новости >>>



  • IT-консалтинг Software Engineering Программирование Open Source СУБД Безопасность Internet Сети Операционные системы Hardware

    Информация для рекламодателей PR-акции, размещение рекламы - pr@citforum.ru, тел. +7 095 4119920 Пресс-релизы - manager@citforum.ru
    Послать комментарий
    Информация для авторов
    Rambler's Top100 TopList liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня This Web server launched on February 24, 1997
    Copyright © 1997-2000 CIT, © 2001-2004 CIT Forum
    Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...