LXF74-75:PHP1
Yaleks (обсуждение | вклад) (Новая: {{Цикл/PHP}} == Разбираемся с Google API == ''«Тру-ля-ля, тра-ля-ля», – напевал '''Пол Хадсон''' (Paul Hudson), впервые за э...) |
Yaleks (обсуждение | вклад) м (→Хадзилла возвращается) |
||
(не показана 1 промежуточная версия 1 участника) | |||
Строка 2: | Строка 2: | ||
== Разбираемся с Google API == | == Разбираемся с Google API == | ||
− | ''«Тру-ля-ля, тра-ля-ля», | + | ''«Тру-ля-ля, тра-ля-ля», — напевал '''Пол Хадсон''' (Paul Hudson), впервые за этот год раздобыв кусочек МЫЛА и отправляясь в ванную подумать о WSDL.'' |
Ostagazuzulum! Нет, я не стучу от нечего делать по клавиатуре и не начитался Гарри Поттера. В свое время, компания | Ostagazuzulum! Нет, я не стучу от нечего делать по клавиатуре и не начитался Гарри Поттера. В свое время, компания | ||
− | BBC выпускала изумительную программу для | + | BBC выпускала изумительную программу для детей — Wizbit. |
− | Главная роль в ней была отведена большой желтой волшебной шляпе | + | Главная роль в ней была отведена большой желтой волшебной шляпе - |
Wizbit, которая умела летать и совершать волшебство. Нереально, я | Wizbit, которая умела летать и совершать волшебство. Нереально, я | ||
− | знаю. У Wizbit было два основных заклинания: | + | знаю. У Wizbit было два основных заклинания: «Ostagazuzulum» (это |
− | волшебное слово заставляло все работать, как надо) и | + | волшебное слово заставляло все работать, как надо) и «Think about it» |
(«подумай об этом»), причем последнее она произносила лишь тогда, | («подумай об этом»), причем последнее она произносила лишь тогда, | ||
когда предлагала своей юной аудитории новую загадку. | когда предлагала своей юной аудитории новую загадку. | ||
− | Как мы все прекрасно знаем, достаточно развитая | + | Как мы все прекрасно знаем, достаточно развитая технология — это |
− | та же магия, и в этом выпуске мы попробуем проделать кое-какие трюки самостоятельно. Мы будем использовать SOAP (англ. «мыло», | + | та же магия, и в этом выпуске мы попробуем проделать кое-какие трюки самостоятельно. Мы будем использовать SOAP (англ. «мыло», - |
прим.перев.), WSDL, XML и web-сервисы. Да, сейчас я произнес | прим.перев.), WSDL, XML и web-сервисы. Да, сейчас я произнес | ||
− | несколько страшных слов, но не | + | несколько страшных слов, но не беспокойтесь — я объясню, что они |
значат и зачем нужны, и вы будет просто сгорать от нетерпения, | значат и зачем нужны, и вы будет просто сгорать от нетерпения, | ||
п о н я т н о ? Отвечайте же: «Да, Пол!» | п о н я т н о ? Отвечайте же: «Да, Пол!» | ||
Строка 31: | Строка 31: | ||
Итак, первым из четырех основных компонентов нашей магии является SOAP, или Simple Object Access Protocol (простой протокол для | Итак, первым из четырех основных компонентов нашей магии является SOAP, или Simple Object Access Protocol (простой протокол для | ||
доступа к объектам). Это облегченный протокол для обмена информацией, работающий поверх HTTP. С его помощью мы отправляем на | доступа к объектам). Это облегченный протокол для обмена информацией, работающий поверх HTTP. С его помощью мы отправляем на | ||
− | сервер запрос и получаем результат. WSDL (произносится как «виздулл» и немного напоминает Wizbit, что, впрочем, случайность) | + | сервер запрос и получаем результат. WSDL (произносится как «виздулл» и немного напоминает Wizbit, что, впрочем, случайность) — это |
Web Service Definition Language (язык описания web-сервисов), средство для описания интерфейсов, которые вы можете использовать | Web Service Definition Language (язык описания web-сервисов), средство для описания интерфейсов, которые вы можете использовать | ||
через SOAP. | через SOAP. | ||
Строка 52: | Строка 52: | ||
нажмите Create Account. Вам может потребоваться использовать | нажмите Create Account. Вам может потребоваться использовать | ||
новый e-mail адрес, если система откажет вам в регистрации. После | новый e-mail адрес, если система откажет вам в регистрации. После | ||
− | прохождения этой процедуры на ваш адрес будет выслан ключ, дающий вам право на 1000 запросов в день. Сохраните его где-нибудь | + | прохождения этой процедуры на ваш адрес будет выслан ключ, дающий вам право на 1000 запросов в день. Сохраните его где-нибудь - |
он потребуется нам чуть позже. | он потребуется нам чуть позже. | ||
Строка 66: | Строка 66: | ||
var_dump($result = $soap->__getFunctions()); | var_dump($result = $soap->__getFunctions()); | ||
?></source> | ?></source> | ||
− | Всего две строки | + | Всего две строки и — вуаля! — вы уже в стране web-сервисов. |
В первой строке создается объект SoapClient, с помощью которого мы | В первой строке создается объект SoapClient, с помощью которого мы | ||
отправляем и получаем данные. Конструктору этого класса передается | отправляем и получаем данные. Конструктору этого класса передается | ||
Строка 90: | Строка 90: | ||
будет особенно интересовать третья функция: doGoogleSearch(). Как | будет особенно интересовать третья функция: doGoogleSearch(). Как | ||
вы можете видеть, она имеет большое число параметров, причем некоторые названы весьма причудливо. Вот их смысл: | вы можете видеть, она имеет большое число параметров, причем некоторые названы весьма причудливо. Вот их смысл: | ||
− | * $ | + | * $key — это уникальный ключ, который Google выдал вам для персонального использования. Не раздавайте его кому попало, поскольку на один ключ допускается не более 1000 запросов в сутки. |
− | * $ | + | * $q — это текст запроса |
− | * $ | + | * $start — точка, с которой вы хотите начать вывод результатов. Например, если $start=1000, вы пропустите первую тысячу результатов. |
− | * $ | + | * $maxResults — максимальное число результатов поиска, которые вы хотите получить. Google ограничивает эту величину десятью, поэтому вам может потребоваться изменять значение параметра $start и делать несколько вызовов, если вы хотите получить больше. |
− | * $ | + | * $filter — должен ли Google игнорировать множественные результаты для одного сайта или похожие результаты на различных сайтах? |
− | * $ | + | * $restrict — следует ли Google ограничиться определенной страной или регионом? |
− | * $ | + | * $safeSearch — Вас интересуют материалы «для взрослых»? |
− | * $ | + | * $lr — позволяет установить языковые ограничения. |
− | * $ | + | * $ie — входная кодировка. В настоящий момент это поле игнорируется, так что передайте здесь пустую строку. |
− | * $ | + | * $oe — выходная кодировка. Это поле также игнорируется. |
Да, для вызова этой несложной функции потребуется приличное | Да, для вызова этой несложной функции потребуется приличное | ||
число параметров, но это неизбежная плата за гибкость. Приступим? | число параметров, но это неизбежная плата за гибкость. Приступим? | ||
Строка 164: | Строка 164: | ||
поле estimatedTotalResultsCount (приблизительное число результатов поиска), а также массив resultElements. Мы запросили всего | поле estimatedTotalResultsCount (приблизительное число результатов поиска), а также массив resultElements. Мы запросили всего | ||
пять результатов ($max_results=5), а это значит, что число элементов в resultElements также не будет превышать пяти. Первый | пять результатов ($max_results=5), а это значит, что число элементов в resultElements также не будет превышать пяти. Первый | ||
− | результат имеет индекс 0, | + | результат имеет индекс 0, второй — 1 и так далее. Для каждого из |
результатов предоставляются: URL, заголовок страницы (из <title>), | результатов предоставляются: URL, заголовок страницы (из <title>), | ||
выдержка из текста (несколько слов, обрамляющих поисковый | выдержка из текста (несколько слов, обрамляющих поисковый | ||
Строка 184: | Строка 184: | ||
например, выделяет найденные слова | например, выделяет найденные слова | ||
жирным шрифтом. Некоторые web-сайты | жирным шрифтом. Некоторые web-сайты | ||
− | используют >, так что нам также придется конвертировать их в символы (>, | + | используют &gt;, так что нам также придется конвертировать их в символы (>, |
в данном случае), а также выкинуть все | в данном случае), а также выкинуть все | ||
тэги, которые не предназначены для прямого вывода на экран. | тэги, которые не предназначены для прямого вывода на экран. | ||
Давайте же, запустите этот сценарий и громко скажите: | Давайте же, запустите этот сценарий и громко скажите: | ||
− | + | «Ostagazuzulum!». Вы увидите что-то вроде: | |
<source lang="text">Search for Hudzilla complete - 2340 estimated results. | <source lang="text">Search for Hudzilla complete - 2340 estimated results. | ||
Practical PHP Programming | Practical PHP Programming | ||
http://www.hudzilla.org/php/index.php | http://www.hudzilla.org/php/index.php | ||
Hudzilla.org - the homepage of Paul Hudson</source> | Hudzilla.org - the homepage of Paul Hudson</source> | ||
− | Думаю, вы | + | Думаю, вы согласитесь — все достаточно просто. Мощь WSDL |
состоит в том, что вам не нужно заранее знать, какой функционал | состоит в том, что вам не нужно заранее знать, какой функционал | ||
− | предоставляет Google, сила | + | предоставляет Google, сила SOAP — в том, что вам не нужно |
заботиться о том, как передаются по сети все эти объекты. | заботиться о том, как передаются по сети все эти объекты. | ||
− | На последнем этапе в бой вступает | + | На последнем этапе в бой вступает PHP — он позволяет вам |
добиться результатов всего парой строчек кода. Вот это | добиться результатов всего парой строчек кода. Вот это | ||
чудеса! | чудеса! |
Текущая версия на 16:12, 6 декабря 2008
|
|
|
- Метамодернизм в позднем творчестве В.Г. Сорокина
- ЛитРПГ - последняя отрыжка постмодерна
- "Ричард III и семиотика"
- 3D-визуализация обложки Ridero создаем обложку книги при работе над самиздатом.
- Архитектура метамодерна - говоря о современном искусстве, невозможно не поговорить об архитектуре. В данной статье будет отмечено несколько интересных принципов, характерных для построек "новой волны", столь притягательных и скандальных.
- Литература
- Метамодерн
- Рокер-Прометей против изначального зла в «Песне про советскую милицию» Вени Дркина, Автор: Нина Ищенко, к.ф.н, член Союза Писателей ЛНР - перепубликация из журнала "Топос".
- Как избавиться от комаров? Лучшие типы ловушек.
- Что делать если роблокс вылетает на windows
- Что делать, если ребенок смотрит порно?
- Почему собака прыгает на людей при встрече?
- Какое масло лить в Задний дифференциал (мост) Visco diff 38434AA050
- О чем может рассказать хвост вашей кошки?
- Верветки
- Отчетность бюджетных учреждений при закупках по Закону № 223-ФЗ
- Срок исковой давности как правильно рассчитать
- Дмитрий Патрушев минсельхоз будет ли преемником Путина
- Кто такой Владислав Поздняков? Что такое "Мужское Государство" и почему его признали экстремистским в России?
- Как правильно выбрать машинное масло в Димитровграде?
- Как стать богатым и знаменитым в России?
- Почему фильм "Пипец" (Kick-Ass) стал популярен по всему миру?
- Как стать мудрецом?
- Как правильно установить FreeBSD
- Как стать таким как Путин?
- Где лучше жить - в Димитровграде или в Ульяновске?
- Почему город Димитровград так называется?
- Что такое метамодерн?
- ВАЖНО! Временное ограничение движения автотранспортных средств в Димитровграде
- Тарифы на электроэнергию для майнеров предложено повысить
Содержание |
[править] Разбираемся с Google API
«Тру-ля-ля, тра-ля-ля», — напевал Пол Хадсон (Paul Hudson), впервые за этот год раздобыв кусочек МЫЛА и отправляясь в ванную подумать о WSDL.
Ostagazuzulum! Нет, я не стучу от нечего делать по клавиатуре и не начитался Гарри Поттера. В свое время, компания BBC выпускала изумительную программу для детей — Wizbit. Главная роль в ней была отведена большой желтой волшебной шляпе - Wizbit, которая умела летать и совершать волшебство. Нереально, я знаю. У Wizbit было два основных заклинания: «Ostagazuzulum» (это волшебное слово заставляло все работать, как надо) и «Think about it» («подумай об этом»), причем последнее она произносила лишь тогда, когда предлагала своей юной аудитории новую загадку.
Как мы все прекрасно знаем, достаточно развитая технология — это та же магия, и в этом выпуске мы попробуем проделать кое-какие трюки самостоятельно. Мы будем использовать SOAP (англ. «мыло», - прим.перев.), WSDL, XML и web-сервисы. Да, сейчас я произнес несколько страшных слов, но не беспокойтесь — я объясню, что они значат и зачем нужны, и вы будет просто сгорать от нетерпения, п о н я т н о ? Отвечайте же: «Да, Пол!»
[править] Принимаемся за дело
- Метамодернизм в позднем творчестве В.Г. Сорокина
- ЛитРПГ - последняя отрыжка постмодерна
- "Ричард III и семиотика"
- 3D-визуализация обложки Ridero создаем обложку книги при работе над самиздатом.
- Архитектура метамодерна - говоря о современном искусстве, невозможно не поговорить об архитектуре. В данной статье будет отмечено несколько интересных принципов, характерных для построек "новой волны", столь притягательных и скандальных.
- Литература
- Метамодерн
- Рокер-Прометей против изначального зла в «Песне про советскую милицию» Вени Дркина, Автор: Нина Ищенко, к.ф.н, член Союза Писателей ЛНР - перепубликация из журнала "Топос".
- Как избавиться от комаров? Лучшие типы ловушек.
- Что делать если роблокс вылетает на windows
- Что делать, если ребенок смотрит порно?
- Почему собака прыгает на людей при встрече?
- Какое масло лить в Задний дифференциал (мост) Visco diff 38434AA050
- О чем может рассказать хвост вашей кошки?
- Верветки
- Отчетность бюджетных учреждений при закупках по Закону № 223-ФЗ
- Срок исковой давности как правильно рассчитать
- Дмитрий Патрушев минсельхоз будет ли преемником Путина
- Кто такой Владислав Поздняков? Что такое "Мужское Государство" и почему его признали экстремистским в России?
- Как правильно выбрать машинное масло в Димитровграде?
- Как стать богатым и знаменитым в России?
- Почему фильм "Пипец" (Kick-Ass) стал популярен по всему миру?
- Как стать мудрецом?
- Как правильно установить FreeBSD
- Как стать таким как Путин?
- Где лучше жить - в Димитровграде или в Ульяновске?
- Почему город Димитровград так называется?
- Что такое метамодерн?
- ВАЖНО! Временное ограничение движения автотранспортных средств в Димитровграде
- Тарифы на электроэнергию для майнеров предложено повысить
Итак, первым из четырех основных компонентов нашей магии является SOAP, или Simple Object Access Protocol (простой протокол для доступа к объектам). Это облегченный протокол для обмена информацией, работающий поверх HTTP. С его помощью мы отправляем на сервер запрос и получаем результат. WSDL (произносится как «виздулл» и немного напоминает Wizbit, что, впрочем, случайность) — это Web Service Definition Language (язык описания web-сервисов), средство для описания интерфейсов, которые вы можете использовать через SOAP.
XML, я надеюсь, вы уже знаете. Сегодня мы будем использовать его вместе с SOAP и WSDL, так что наши данные смогут быть легко переработаны на обоих концах. Объединив все это, мы получим web-сервисы. Мы можем узнать у сервера, что он умеет делать, послать ему данные, получить результаты и вывести их на экран.
Теперь давайте подумаем: какие вещи мы мы можем запросить через Web? Варианты могут быть различными: загрузить с Amazon базу данных их продукции, получить котировки акций или сделать что-то более интересное с помощью Google. О последнем мы и поговорим более подробно.
В этом учебнике мы рассмотрим, как посылать запросы в Google, используя PHP и web-сервисы, а также использовать их результаты в наших сценариях. Это, конечно, не так эффектно, как вытащить кролика из шляпы, но я ни за что не поверю, что у Google нет феи и даже крестной. Чтобы воспользоваться web-сервисами Google, вам придется завести на нем учетную запись. Посетите www.google.com/apis и нажмите Create Account. Вам может потребоваться использовать новый e-mail адрес, если система откажет вам в регистрации. После прохождения этой процедуры на ваш адрес будет выслан ключ, дающий вам право на 1000 запросов в день. Сохраните его где-нибудь - он потребуется нам чуть позже.
[править] Начинаются чудеса
Одевайте свой волшебный колпак и приготовьтесь к магии. Мы будем использовать SOAP-расширения PHP5 для чтения WSDL-Файла Google, а затем использовать эти данные для отправки запроса. WSDL-файл доступен по адресу http://api.google.com/GoogleSearch.wsdl, загрузите его на свой компьютер и сохраните в одном каталоге со сценарием. Теперь создайте файл google1.php со следующим содержимым:
<?php $soap = new SoapClient(‘GoogleSearch.wsdl’); var_dump($result = $soap->__getFunctions()); ?>
Всего две строки и — вуаля! — вы уже в стране web-сервисов. В первой строке создается объект SoapClient, с помощью которого мы отправляем и получаем данные. Конструктору этого класса передается имя WSDL-файла, который содержит в себе перечень доступных функций и их параметров. Мы передаем ему описание интерфейса Google API. Вторая строка вызывает волшебную функцию __getFunctions(). Она возвращает массив функций, предоставляемых SOAP-объектом. Вывод сценария будет следующим:
array(3) { [0]=> string(54) "base64Binary doGetCachedPage(string $key, string $url)" [1]=>string(56) "string doSpellingSuggestion(string $key, string $phrase)" [2]=> string(178) "GoogleSearchResult doGoogleSearch(string $key, string $q, int $start, int $maxResults, boolean $filter, string $restrict, boolean $safeSearch, string $lr, string $ie, string $oe)" }
Это очень похоже на прототипы функций PHP. Например, вторая функция имеет имя doSpellingSuggestion, принимает два параметра ($key и $phrase, оба являются строками) и возвращает строку. Нас будет особенно интересовать третья функция: doGoogleSearch(). Как вы можете видеть, она имеет большое число параметров, причем некоторые названы весьма причудливо. Вот их смысл:
- $key — это уникальный ключ, который Google выдал вам для персонального использования. Не раздавайте его кому попало, поскольку на один ключ допускается не более 1000 запросов в сутки.
- $q — это текст запроса
- $start — точка, с которой вы хотите начать вывод результатов. Например, если $start=1000, вы пропустите первую тысячу результатов.
- $maxResults — максимальное число результатов поиска, которые вы хотите получить. Google ограничивает эту величину десятью, поэтому вам может потребоваться изменять значение параметра $start и делать несколько вызовов, если вы хотите получить больше.
- $filter — должен ли Google игнорировать множественные результаты для одного сайта или похожие результаты на различных сайтах?
- $restrict — следует ли Google ограничиться определенной страной или регионом?
- $safeSearch — Вас интересуют материалы «для взрослых»?
- $lr — позволяет установить языковые ограничения.
- $ie — входная кодировка. В настоящий момент это поле игнорируется, так что передайте здесь пустую строку.
- $oe — выходная кодировка. Это поле также игнорируется.
Да, для вызова этой несложной функции потребуется приличное число параметров, но это неизбежная плата за гибкость. Приступим?
[править] Хадзилла возвращается
Вооружившись знаниями о всемогущей doGoogleSearch(), попробуем выполнить следующий код:
<?php $soap = new SoapClient('GoogleSearch.wsdl'); $key = "ВАШ_КЛЮЧ_GOOGLE"; $query = "Hudzilla"; $start = 0; $max_results = 5; $filter = false; $restrict = ""; $safe_search = false; $language_restrict = ""; $input_encoding = ""; $output_encoding = ""; $result = $soap->doGoogleSearch($key, $query, $start, $max_results, $filter, $restrict, $safe_search, $language_restrict, $input_encoding, $output_encoding); if (is_soap_fault($result)) { print "Your query failed: {$result->faultstring}\n"; } else { print_r( $result ); } ?>
- Метамодернизм в позднем творчестве В.Г. Сорокина
- ЛитРПГ - последняя отрыжка постмодерна
- "Ричард III и семиотика"
- 3D-визуализация обложки Ridero создаем обложку книги при работе над самиздатом.
- Архитектура метамодерна - говоря о современном искусстве, невозможно не поговорить об архитектуре. В данной статье будет отмечено несколько интересных принципов, характерных для построек "новой волны", столь притягательных и скандальных.
- Литература
- Метамодерн
- Рокер-Прометей против изначального зла в «Песне про советскую милицию» Вени Дркина, Автор: Нина Ищенко, к.ф.н, член Союза Писателей ЛНР - перепубликация из журнала "Топос".
- Как избавиться от комаров? Лучшие типы ловушек.
- Что делать если роблокс вылетает на windows
- Что делать, если ребенок смотрит порно?
- Почему собака прыгает на людей при встрече?
- Какое масло лить в Задний дифференциал (мост) Visco diff 38434AA050
- О чем может рассказать хвост вашей кошки?
- Верветки
- Отчетность бюджетных учреждений при закупках по Закону № 223-ФЗ
- Срок исковой давности как правильно рассчитать
- Дмитрий Патрушев минсельхоз будет ли преемником Путина
- Кто такой Владислав Поздняков? Что такое "Мужское Государство" и почему его признали экстремистским в России?
- Как правильно выбрать машинное масло в Димитровграде?
- Как стать богатым и знаменитым в России?
- Почему фильм "Пипец" (Kick-Ass) стал популярен по всему миру?
- Как стать мудрецом?
- Как правильно установить FreeBSD
- Как стать таким как Путин?
- Где лучше жить - в Димитровграде или в Ульяновске?
- Почему город Димитровград так называется?
- Что такое метамодерн?
- ВАЖНО! Временное ограничение движения автотранспортных средств в Димитровграде
- Тарифы на электроэнергию для майнеров предложено повысить
В этом примере я использовал переменные, чтобы сохранить различные параметры SOAP-запроса. Это, конечно, необязательно: в своих собственных сценариях вы можете использовать эти значения напрямую. Я сделал это исключительно для того, чтобы дать параметрам понятные имена (например $output_encoding). Функция doGoogleSearch() возвращает класс, который содержит различную информацию, и данный сценарий попросту выводит все на экран, чтобы вы получили какое-никакое представление о том, с чем имеете дело.
Вот вывод сценария:
stdClass Object ( [estimatedTotalResultsCount] => 2290 [resultElements] => Array ( [0] => stdClass Object ( [URL] => http://www.hudzilla.org/php/index.php [snippet] => <b>Hudzilla</b>.org - the homepage of Paul Hudson [title] => Practical PHP Programming [cachedSize] => 68k )
Конечно, реальный результат будет длиннее, но мы побережем бумагу и приведем лишь первые 12 строк. Как видно, объект имеет поле estimatedTotalResultsCount (приблизительное число результатов поиска), а также массив resultElements. Мы запросили всего пять результатов ($max_results=5), а это значит, что число элементов в resultElements также не будет превышать пяти. Первый результат имеет индекс 0, второй — 1 и так далее. Для каждого из результатов предоставляются: URL, заголовок страницы (из <title>), выдержка из текста (несколько слов, обрамляющих поисковый запрос) и размер страницы в кэше Google. Немного поднапрягшись, мы можем организовать цикл по этим элементам и вывести их в простом и удобном виде:
print "Search for $query complete - {$result->estimatedTo talResultsCount} estimated results.\n"; foreach($result->resultElements as $search_result) { print " {$search_result->title}\n"; print " {$search_result->URL}\n"; print " " . strip_tags(htmlspecialchars_decode($search_result->snippet)) . "\n\n"; }
Большая часть этого кода очевидна, за исключением, пожалуй, последней строки. Google возвращает данные в формате, пригодном для отправки в web-браузер, то есть, например, выделяет найденные слова жирным шрифтом. Некоторые web-сайты используют >, так что нам также придется конвертировать их в символы (>, в данном случае), а также выкинуть все тэги, которые не предназначены для прямого вывода на экран.
Давайте же, запустите этот сценарий и громко скажите: «Ostagazuzulum!». Вы увидите что-то вроде:
Search for Hudzilla complete - 2340 estimated results. Practical PHP Programming http://www.hudzilla.org/php/index.php Hudzilla.org - the homepage of Paul Hudson
Думаю, вы согласитесь — все достаточно просто. Мощь WSDL состоит в том, что вам не нужно заранее знать, какой функционал предоставляет Google, сила SOAP — в том, что вам не нужно заботиться о том, как передаются по сети все эти объекты. На последнем этапе в бой вступает PHP — он позволяет вам добиться результатов всего парой строчек кода. Вот это чудеса!