Функции direct io


Содержание

Функции Direct IO

PHP поддерживает функции direct io, как описано в стандарте Posix Standard (Раздел 6), для выполнения функций I/O на уровне более низком, чем I/O-функции потока языка C (fopen, fread. ).

Эти функции всегда доступны как часть стандартного модуля.

Данная библиотека работает в Windows только на базе PHP 5.

Чтобы эти функции работали, вы должны сконфигурировать РНР с опцией —enable-dio .

Это расширение не определяет никаких директив конфигурации.

Этим расширением определён один тип ресурсов: дескриптор файла, возвращаемый функцией dio_open() .

Это расширение не определяет никаких констант.

Функции direct io

TOP 3 сервисов в категории Раскрутка Инстаграм :

Bosslike 3.85
SocialHammer 3.65
Instaplus 3.44

Idirect.io – сервис, предоставляющий услугу массовой рассылки сообщений в Инстаграме. Сайт создан в 2020 году. Проект использует облачные технологии и выделенные прокси-сервер для доставки сотен тысяч сообщений в день.

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

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

Доступные тарифы

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

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

Пакет «Премиум» дает возможность в 10 потоков для 5 аккаунтов ежедневно отправлять 2 500 писем за 490 рублей в месяц.

Тариф «Элитный» — 50 рассылок одновременно для 50 аккаунтов, итого 125 000 сообщений за 24 часа, стоимость – 890 рублей за 30 дней.

Как работать с Idirect.io

Добавьте новый аккаунт в социальной сети Instagram, подтвердите право на его использование, перейдя по ссылке из присланного вам письма. Чтобы начать рассылку, необходимо сформировать подписную базу. Зайдите в раздел аудитории и импортируйте подписчиков из своего аккаунта или вручную запишите ID и логин пользователя в специальном поле, каждая запись должна начинаться с новой строки. Если у вас нет собственных пользователей, перейдите во вкладку «Парсер», скачайте программу на свое десктопное устройство, инсталлируйте ее, запустите. Выберите предложенные хэштеги по вашей тематике или напишите подходящие вручную. По умолчанию для каждого хэштега будет собрана аудитория в 1000 человек, вы всегда можете изменить настройки. Сохраните полученный результат и перенесите информацию в вашу базу подписчиков методом простого копирования или сохраните в формате XML.

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

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

Текст сообщения можно уникализировать с помощью встроенного синомайзера.

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

Партнерская программа

Администрация предлагает зарабатывать денежные средства, привлекая новых пользователей проекта. Вы получите 20% от всех расходов приглашенного клиента в течение 3 месяцев. Каждый пользователь будет приносить минимум 50 рублей. Реферальную ссылку вы получите после активации партнерской программы в личном кабинете. Заработанные деньги можно перевести на основной баланс для оплаты услуг сервиса или вывести из системы. Минимальная сумма вывода 100 рублей. Средства перечисляются на электронный кошелек WebMoney, Яндекс Деньги, Qiwi в течение 3 дней по запросу.

Direct IO

Direct I/O is a system-wide feature that supports direct reads/writes from/to storage device to/from user memory space bypassing system page cache. Buffered I/O is usually the default I/O mode enabled by most operating systems.

Why do we need it?

With buffered I/O, the data is copied twice between storage and memory because of the page cache as the proxy between the two. In most cases, the introduction of page cache could achieve better performance. But for self-caching applications such as RocksDB, the application itself should have a better knowledge of the logical semantics of the data than OS, which provides a chance that the applications could implement more efficient replacement algorithm for cache with any application-defined data block as a unit by leveraging their knowledge of data semantics. On the other hand, in some situations, we want some data to opt-out of system cache. At this time, direct I/O would be a better choice.

The way to enable direct I/O depends on the operating system and the support of direct I/O depends on the file system. Before using this feature, please check whether the file system supports direct I/O. RocksDB has dealt with these OS-dependent complications for you, but we are glad to share some implementation details here.

For LINUX, the O_DIRECT flag has to be included. For Mac OSX, O_DIRECT is not available. Instead, fcntl(fd, F_NOCACHE, 1) looks to be the canonical solution where fd is the file descriptor of the file. For Windows, there is a flag called FILE_FLAG_NO_BUFFERING as the counterpart in Windows of O_DIRECT .


Direct I/O requires file R/W to be aligned, which means, the position indicator (offset), #bytes and the buffer address must be aligned to the logical sector size of the underlying storage device. So the position indicator should and the buffer pointer must be aligned on a logical sector size boundary and the number of bytes to be read or written must be in multiples of the logical sector size. RocksDB implements all the alignment logic inside FileReader/FileWriter , one layer higher abstraction on top of File classes to make the alignment ignorant to the OS. Thus, different OSs could have their own implementations of File Classes.

It is easy to use Direct I/O as two new options are provided in options.h:

The code is self-explanatory.

You may also need other options to optimize direct I/O performance.

Recent releases have these options automatically set if direct I/O is enabled.

XXIII. Функции Direct IO

PHP поддерживает функции direct io, как описано в стандарте Posix Standard (Раздел 6), для выполнения функций I/O на уровне более низком, чем I/O-функции потока языка C (fopen, fread. ).

Эти функции всегда доступны как часть стандартного модуля.

Чтобы эти функции работали, вы должны сконфигурировать РНР с опцией —enable-dio .

Это расширение не определяет никаких директив конфигурации.

Этим расширением определён один тип ресурсов: дескриптор файла, возвращаемый функцией dio_open() .

Это расширение не определяет никаких констант.

Функции direct io

«Direct I/O is the world’s first device driver for Microsoft and which enables the direct hardware access for your existing software without any programming efforts on your side».

Введение

Из вышеприведенной цитаты, думаю понятно, что объектом исследования является приложение, позволяющее другим программам обращаться напрямую к оборудованию. С этим не возникало проблем, когда программы работали под управлением операционных систем Windows, предшественников Windows NT, но времена идут, архитектура меняется, а переделывать старые программы, зачастую просто нет возможности. Принцип, по которому работает драйвер Direct I/O (и аналогичные программы) не нов, и был опубликован в журнале Dr.Dobb’s за май 1996 года, автором статьи (русский перевод которой можно найти на void.ru) является Дейл Робертс.

Видимо многим low-level программистам не составит особого труда реализовать аналогичную программу, времени на это может уйти меньше, чем на написание этой статьи и окажется это более достойным занятием, чем- то, которым будем заниматься мы, а именно — исследованием той части программы, которая касается её защиты от нелицензионного использования. Используемая при этом технология довольно простая, но может кому-то показаться интересной, т.к. статья имеет исключительно, и по возможности максимально, познавательный характер. Это путь авторам, который покажет слабые места их программ, покажет, чем пользуются, и что руководит людьми, когда нужная им программа отказывается работать больше месяца, когда нет денег, кредитной карты или просто рядом нет банка.

Знакомство

Итак, что происходит, когда нет вышеперечисленных проблем:

  • Вы покупаете программу и сообщаете автору Name или Company, на которые желаете зарегистрировать программу, после чего получаете Key

«The license information consists of three entries: Name, Company and Key. Name or Company may be empty, but Key always is a 128 character long string formatted into two lines as shown in the example below».

  • Пример регистрационных данных, мы попробуем их ввести в программу:
Name: John Doe
Company: ACME Corp.
Key: 143E6B6BA98DCE3D8833DC4FC67301D1173CEB17075906AE38B20EC289085BDE F65744EB4561936040A6B352ADC6ED4E585FC8075FA55927CAE6414A7215A9E7
  • После того, как в окне «License» (Рис.1) будут введены правильные данные (которых у нас нет), программа начинает работать в полнофункциональном режиме. Иначе она работает в 30-ти дневном trial-режиме и при каждой её инициализации выводит наг-скрин (Рис.2)

Это не трехзначный пароль, который можно подобрать даже руками, столько букв, цифр . Давайте для начала соберем максимально возможную информацию о программе, о её обращениях к реестру, к файлам, о взаимодействие с операционной системой. Лучше всего это начинать ещё во время установки программы, но мы сделаем только в тот момент, когда будем нажимать кнопку «OK» (Рис.1)

Сокрытые ключи реестра

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

Process Path Other
rundll32.exe HKLM\SOFTWARE\Paule\Direct I/O\CurrentVersion\Name John Doe
rundll32.exe HKLM\SOFTWARE\Paule\Direct I/O\CurrentVersion\Company ACME Corp.
rundll32.exe HKLM\SOFTWARE\Paule\Direct I/O\CurrentVersion\Key 14 3E 6B .
rundll32.exe HKLM\SOFTWARE\Microsoft\Cryptography\Defaults\Provider \Microsoft Base Cryptographic Provider v1.0\Image Path rsabase.dll
rundll32.exe HKLM\SOFTWARE\Paule\Direct I/O\CurrentVersion\TimeLock\Licensed 0x0
rundll32.exe HKLM\SOFTWARE\Paule\Direct I/O\CurrentVersion\TimeLock\InstallTime 00 E9 6B .

Обратите внимание, что процессом является rundll32.exe, а почему, ответ найдем в свойствах ярлыка программы, запускается она такой строкой: «C:\WINNT\system32\rundll32.exe shell32.dll,Control_RunDLL DirectIO.CPL». Расширение .CPL означает, что это аплет панели управления.

Из таблицы теперь понятно, в какой ветке реестра программа хранит регистрационные данные, также понятно, что задействована криптография и . сначала не верим своим глазам, но «Licensed» — ведь это слово обозначает, зарегистрирована ли программа, предполагает два ответа: да или нет, true или false, 1 или 0. Наивно, но почему бы не открыть regedit и проставить 0x1? Конечно, пробуем и вот здесь мы сразу спотыкаемся на «первом уровне» защиты.

Regedit нам сообщает, что не удается открыть «TimeLock». Ошибка при открытии раздела. Пробуем другие программы для работы с реестром и снова неудача, ни одна не может открыть эту ветку реестра, хотя Regmon то, ведь все отлично показывает, все параметры мы в нем видим. Неужели программа контролирует доступ к своей ветке, маловероятно, но проводим эксперименты вплоть до ручного удаления всех файлов программы: directio.cpl, directio.drv, directio.vdd, directiocoinst.dll, directio.sys, directiofilter.sys, и это все равно ничего не дает. Переходим к поиску в сети любой информации, которая может касаться этой ошибки работы с реестром, попутно задаем вопрос на форуме wasm.ru, где и получаем точный ответ от Four-F: «На sysinternals.com в разделе «Systems internals tips and trivia» есть маленький параграф «Hidden Registry Keys?» и исходник reghide.zip.»

Так и есть, для защиты используется описанное Марком Руссиновичем (автор Regmon-а) различие работы со строками между Win32 API и Native API:

«How is this possible? The answer is that a name which is a counted Unicode string can explicitly include NULL characters (0) as part of the name. For example, «Key\0». To include the NULL at the end the length of the Unicode string is specified as 4. There is absolutely no way to specify this name using the Win32 API since if «Key\0» is passed as a name, the API will determine that the name is «Key» (3 characters in length) because the «\0» indicates the end of the name».


Коротко говоря, когда вы создаете ключ реестра с помощью RegCreateKey (Win32 API), то передаете строку с именем ключа (например «Key»), но длину строки вы не указываете, функция высчитывает ее сама (как только встретит 0x0). А при использовании функции NtCreateKey (Native API), мы обязаны явно указать какой длины хотим создать ключ, по этому для строки «Key» можно определить длину как 4 и потом эту ветку, из-за несовпадения длин, будет невозможно открыть функциями Win32 API.

Значит для того, чтобы изменить параметр «Licensed» нам нужно использовать Native API, в исходнике reghide.zip можно (достаточно для начала) почерпнуть информации, как это сделать.

К сожалению, я (возможно и вы) ещё не знакомы с языком C, но уже знаете или Вас больше привлекает ассемблер, по этому именно на нём сделаем программу, главной целью которой будет изменить параметр «Licensed» с 0x0 на 0x1 . Будем использовать при этом FASM. Ниже я сразу приведу готовый код, скажу только, что все необходимые структуры, константы и некоторые примеры для работы с Native API, можно найти в Kernel Mode Driver Development Kit by Four-F.

Функции Direct IO

PHP поддерживает функции direct io, как описано в стандарте Posix Standard (Раздел 6), для выполнения функций I/O на уровне более низком, чем I/O-функции потока языка C (fopen, fread. ).

Илон Маск рекомендует:  Что такое код asp aspscripterrormessage

Эти функции всегда доступны как часть стандартного модуля.

Данная библиотека работает в Windows только на базе PHP 5.

Чтобы эти функции работали, вы должны сконфигурировать РНР с опцией —enable-dio .

Это расширение не определяет никаких директив конфигурации.

Этим расширением определён один тип ресурсов: дескриптор файла, возвращаемый функцией dio_open() .

Это расширение не определяет никаких констант.

Функции direct io

ч ПФМЙЮЙЕ ПФ УЧПЕЗП РТБТПДЙФЕМС рБУЛБМС, бДБ ОЕ УПДЕТЦЙФ ЦЕУФЛП ЧУФТПЕООЩИ УТЕДУФЧ ЧЧПДБ/ЧЩЧПДБ. чНЕУФП ЬФПЗП, ДМС ПВЕУРЕЮЕОЙС РПДДЕТЦЛЙ ЧЧПДБ/ЧЩЧПДБ, бДБ РТЕДХУНБФТЙЧБЕФ РТПУФХА, ОП ЬЖЖЕЛФЙЧОХА ЛПММЕЛГЙА УФБОДБТФОЩИ РБЛЕФПЧ, УТЕДУФЧБ ЛПФПТЩИ ЛПОГЕРФХБМШОП РПДПВОЩ УТЕДУФЧБН ЧЧПДБ/ЧЩЧПДБ ВПМШЫЙОУФЧБ УПЧТЕНЕООЩИ ТБУЫЙТЕОЙК рБУЛБМС. рТЕЙНХЭЕУФЧПН ФБЛПЗП ТЕЫЕОЙС СЧМСЕФУС ФП, ЮФП УФБОДБТФОП РТЕДПРТЕДЕМЕООЩЕ РБЛЕФЩ ЧЧПДБ/ЧЩЧПДБ, РТЙ ОЕПВИПДЙНПУФЙ, НПЗХФ ВЩФШ ЪБНЕОЕОЩ. фБЛЙН ПВТБЪПН, ЧЩУПЛПРТПЙЪЧПДЙФЕМШОЩЕ РТЙМПЦЕОЙС ЙМЙ УЙУФЕНЩ ЙУРПМШЪХАЭЙЕ УРЕГЙЖЙЮЕУЛПЕ ПВПТХДПЧБОЙЕ НПЗХФ ОЕ ЙУРПМШЪПЧБФШ ВПМШЫЙОУФЧП УФБОДБТФОП РТЕДМБЗБЕНЩИ УТЕДУФЧ ЧЧПДБ/ЧЩЧПДБ ОЕРПУТЕДУФЧЕООП (РТЙ ЬФПН УМЕДХЕФ ХЮЙФЩЧБФШ, ЮФП НПЦЕФ ВЩФШ ХНЕОШЫЕОБ ЙМЙ ЧПЧУЕ ХФТБЮЕОБ РЕТЕОПУЙНПУФШ ЛПОЕЮОЩИ РТПЗТБНН). ч РПДПВОЩИ УМХЮБСИ, УФБОДБТФОЩЕ УТЕДУФЧБ ЧЧПДБ/ЧЩЧПДБ РПНПЗБАФ ЖПТНЙТПЧБФШ ПДОПТПДОЩК ВБЪЙУ ДМС РПУФТПЕОЙС ЬЖЖЕЛФЙЧОПК РПДУЙУФЕНЩ ЖБКМПЧПЗП ПВНЕОБ.

уТЕДУФЧБ ЧЧПДБ/ЧЩЧПДБ бДЩ, ПРТЕДЕМСЕНЩЕ УФБОДБТФПН Ada83, ПВЕУРЕЮЙЧБАФ ЧПЪНПЦОПУФШ ТБВПФЩ У ФЕЛУФПЧЩНЙ Й ДЧПЙЮОЩНЙ ДБООЩНЙ. уФБОДБТФ Ada95 ТБУЫЙТЙМ ЬФЙ УТЕДУФЧБ ЧПЪНПЦОПУФША ЙУРПМШЪПЧБОЙС ЗЕФЕТПЗЕООЩИ РПФПЛПЧ.

рТЕЦДЕ ЮЕН РТЙУФХРЙФШ Л ОЕРПУТЕДУФЧЕООПНХ ПВУХЦДЕОЙА, ОЕПВИПДЙНП ЪБНЕФЙФШ, ЮФП ЙУРПМШЪПЧБОЙЕ УТЕДУФЧ ЧЧПДБ/ЧЩЧПДБ бДЩ НПЦЕФ РПЛБЪБФШУС УОБЮБМБ ДПУФБФПЮОП ОЕ РТЙЧЩЮОЩН. рТЙЮЙОБ ФБЛПК ОЕРТЙЧЩЮОПУФЙ ЪБЛМАЮБЕФУС Ч ФПН, ЮФП РТЙТПДБ УФТПЗПК ФЙРЙЪБГЙЙ ДБООЩИ бДЩ ОБЛМБДЩЧБЕФ УЧПК ПФРЕЮБФПЛ Й ОБ УТЕДУФЧБ ЧЧПДБ/ЧЩЧПДБ, Б ЬФП ЪОБЮЙФ, ЮФП ЧЕУШ ЧЧПД/ЧЩЧПД Ч бДЕ ФБЛЦЕ РПДЧЕТЦЕО УФТПЗПК ФЙРЙЪБГЙЙ ДБООЩИ.

11.1 фЕЛУФПЧЩК ЧЧПД/ЧЩЧПД

ъБНЕФЙН, ЮФП ИПФС УТЕДУФЧБ РПДДЕТЦЛЙ ФЕЛУФПЧПЗП ЧЧПДБ/ЧЩЧПДБ бДЩ ОЕ ТБУУНБФТЙЧБМЙУШ ДП ОБУФПСЭЕЗП НПНЕОФБ, ОЕЛПФПТЩЕ ТБОЕЕ ТБУУНПФТЕООЩЕ РТЙНЕТЩ ХЦЕ РТЙНЕОСМЙ ЬФЙ УТЕДУФЧБ, ПУХЭЕУФЧМСС ЧЧПД/ЧЩЧПД У ЙУРПМШЪПЧБОЙЕН УФБОДБТФОПЗП ХУФТПКУФЧБ ЧЧПДБ/ЧЩЧПДБ. фЕРЕТШ, ОЕПВИПДЙНП ТБУУНПФТЕФШ ЬФЙ НЕИБОЙЪНЩ ВПМЕЕ ДЕФБМШОП.

лБЛ ЙЪЧЕУФОП, ФЕЛУФПЧЩНЙ ЖБКМБНЙ СЧМСАФУС ЖБКМЩ ЛПФПТЩЕ УПДЕТЦБФ УЙНЧПМЩ. лБЛ НЩ ХЦЕ ЪОБЕН, УПЗМБУОП УФБОДБТФБ Ada95, бДБ ПВЕУРЕЮЙЧБЕФ РПДДЕТЦЛХ ДЧХИ УЙНЧПМШОЩИ ФЙРПЧ: Character Й W > уМЕДХЕФ ЪБНЕФЙФШ, ЮФП УФБОДБТФОЩЕ РБЛЕФЩ РПДДЕТЦЛЙ ФЕЛУФПЧПЗП ЧЧПДБ/ЧЩЧПДБ ДМС УЙНЧПМПЧ ФЙРБ Character УПДЕТЦБФ Ч УЧПЕН ОБЪЧБОЙЙ УФТПЛХ Text_IO, Б УФБОДБТФОЩЕ РБЛЕФЩ РПДДЕТЦЛЙ ФЕЛУФПЧПЗП ЧЧПДБ/ЧЩЧПДБ ДМС УЙНЧПМПЧ ФЙРБ W > рПУЛПМШЛХ МПЗЙЛБ ПВТБВПФЛЙ ФЕЛУФПЧПЗП ЧЧПДБ/ЧЩЧПДБ ДМС УЙНЧПМПЧ ФЙРБ Character УППФЧЕФУФЧХЕФ МПЗЙЛЕ ПВТБВПФЛЙ ФЕЛУФПЧПЗП ЧЧПДБ/ЧЩЧПДБ ДМС УЙНЧПМПЧ ФЙРБ Wide_Character, ФП ДМС РПОЙНБОЙС ПТЗБОЙЪБГЙЙ РПДДЕТЦЛЙ ФЕЛУФПЧПЗП ЧЧПДБ/ЧЩЧПДБ бДЩ ДПУФБФПЮОП ТБУУНПФТЕФШ ЬФЙ НЕИБОЙЪНЩ Ч ЛПОФЕЛУФЕ УЙНЧПМПЧ ФЙРБ Character.

11.1.1 рБЛЕФ Ada.Text_IO

пУОПЧПК ПТЗБОЙЪБГЙЙ ФЕЛУФПЧПЗП ЧЧПДБ/ЧЩЧПДБ бДЩ СЧМСЕФУС РБЛЕФ Ada.Text_IO Й ЛПММЕЛГЙС ЕЗП ДПЮЕТОЙИ РБЛЕФПЧ. ьФПФ РБЛЕФ ПВЕУРЕЮЙЧБЕФ УТЕДУФЧБ, ЛПФПТЩЕ РПЪЧПМСАФ НБОЙРХМЙТПЧБФШ ФЕЛУФПЧЩНЙ ЖБКМБНЙ. рТЙНЕТБНЙ ФБЛЙИ УТЕДУФЧ НПЗХФ УМХЦЙФШ РПДРТПЗТБННЩ Close, Delete, Reset, Open, Create .

зМБЧОЩК ФЙР ДБООЩИ РБЛЕФБ Ada.Text_IO - ЬФП МЙНЙФЙТПЧБООЩК РТЙЧБФОЩК ФЙР File_Type. пО СЧМСЕФУС ЧОХФТЕООЙН РТЕДУФБЧМЕОЙЕН ЖБКМБ. уФБОДБТФ Ada95 ДПВБЧЙМ ФЙР File_Access, ЛБЛ УУЩМЛХ ОБ ФЙР File_Type (ПВЯЕЛФЩ ЙНЕАЭЙЕ ФЙР File_Access ЮБУФП ОБЪЩЧБАФ ДЕУЛТЙРФПТБНЙ ЖБКМПЧ). рТЙ ПФЛТЩФЙЙ ЙМЙ УПЪДБОЙЙ ЖБКМБ, РТПЙЪЧПДЙФУС БУУПГЙЙТПЧБОЙЕ НЕЦДХ ЙНЕОЕН ЖБКМБ Ч УЙУФЕНЕ Й ПВЯЕЛФПН ФЙРБ File_Type. лТПНЕ ФПЗП, РТЙ ПФЛТЩФЙЙ ЙМЙ УПЪДБОЙЙ ЖБКМБ, ОЕПВИПДЙНП ХЛБЪЩЧБФШ ТЕЦЙН ДПУФХРБ Л ЖБКМХ:

In_File - ЮФЕОЙЕ ЖБКМБ
Out_File - ЪБРЙУШ Ч ЖБКМ
Append_File - ЪБРЙУШ Ч ЛПОЕГ УХЭЕУФЧХАЭЕЗП ЖБКМБ (Ada95)

ъБНЕФЙН, ЮФП ЬФЙ ЪОБЮЕОЙС ЙНЕАФ ФЙР File_Mode, ЛПФПТЩК ФБЛЦЕ ПРЙУЩЧБЕФУС Ч РБЛЕФЕ Ada.Text_IO. рПУМЕ ЬФПЗП, ПВЯЕЛФ ФЙРБ File_Type НПЦЕФ ВЩФШ ЙУРПМШЪПЧБО ДМС ЧЩРПМОЕОЙС ОЕРПУТЕДУФЧЕООЩИ ПВТБЭЕОЙК Л ЖБКМХ.

ч РТЙЧЕДЕООПН ОЙЦЕ РТЙНЕТЕ, РТПГЕДХТБ Create УПЪДБЕФ ЖБКМ "first_file.dat", РПУМЕ ЮЕЗП, Ч ЬФПФ ЖБКМ РТПГЕДХТБНЙ Put Й New_Line РТПЙЪЧПДЙФУС ЪБРЙУШ УФТПЛЙ "It is my first text file!". ч ЪБЧЕТЫЕОЙЕ, РТПГЕДХТБ Close ЪБЛТЩЧБЕФ ТБОЕЕ ПФЛТЩФЩК ЖБКМ.

рТПЗТБННБ, РТЕДУФБЧМЕООБС Ч УМЕДХАЭЕН РТЙНЕТЕ, ЧЩРПМОСЕФ РПУЙНЧПМШОПЕ ЮФЕОЙЕ ДБООЩИ ЙЪ ПДОПЗП ЖБКМБ ("input.dat") Й РПУЙНЧПМШОХА ЪБРЙУШ ЬФЙИ ЦЕ ДБООЩИ Ч ДТХЗПК ЖБКМ ("output.dat").

оЕПВИПДЙНП ПВТБФЙФШ ЧОЙНБОЙЕ ОБ ФП, ЮФП Ч ФБЛЙИ СЪЩЛБИ РТПЗТБННЙТПЧБОЙС ЛБЛ бДБ Й рБУЛБМШ УХЭЕУФЧХЕФ ЛПОГЕРГЙС ФЕТНЙОБФПТБ УФТПЛЙ, ЛПФПТЩК ОЕ СЧМСЕФУС ПВЩЮОЩН УЙНЧПМПН ЖБКМБ. ьФП ЪОБЮЙФ, ЮФП РПОСФЙЕ "ЛПОЕГ УФТПЛЙ" ("End Of Line", ЙМЙ УПЛТБЭЕООП - EOF) бДЩ ПФМЙЮБЕФУС ПФ ФПЗП, ЮФП РТЙОСФП Ч УЙУФЕНБИ DOS, Windows Й UNIX. ч ЬФЙИ УЙУФЕНБИ ДМС ПВПЪОБЮЕОЙС ЛПОГБ УФТПЛЙ ЙУРПМШЪХЕФУС ПВЩЮОЩК УЙНЧПМ (УЙНЧПМ "CR" - ДМС UNIX, Й УЙНЧПМЩ: "CR", "LF" - ДМС DOS Й Windows), ЛПФПТЩК НПЦЕФ ВЩФШ ПВТБВПФБО ПВЩЮОЩНЙ УТЕДУФЧБНЙ УЙНЧПМШОПК ПВТБВПФЛЙ.

дМС ФПЗП ЮФПВЩ, РТЙ ЮФЕОЙЙ ЙЪ ЖБКМБ, РТПГЕДХТБ Read "РТПЫМБ" ЬФПФ ФЕТНЙОБФПТ, ОЕПВИПДЙНП ЙУРПМШЪПЧБФШ РТПГЕДХТХ Skip_Line. рПДПВОЩН ПВТБЪПН, ДМС ФПЗП ЮФПВЩ ПУХЭЕУФЧЙФШ РПУФТПЮОХА ЪБРЙУШ ЧЩИПДОПЗП ЖБКМБ, ДПМЦОБ ВЩФШ ЙУРПМШЪПЧБОБ РТПГЕДХТБ New_Line.

рБЛЕФ Ada.Text_IO ПВЕУРЕЮЙЧБЕФ ВПМШЫПЕ ЮЙУМП РТПГЕДХТ ДМС ЧЩРПМОЕОЙС ТБЪМЙЮОЩИ ЖБКМПЧЩИ НБОЙРХМСГЙК. ч ЛБЮЕУФЧЕ РТЙНЕТБ ОБЙВПМЕЕ ЮБУФП ЙУРПМШЪХЕНЩИ РТПГЕДХТ НПЦОП РЕТЕЮЙУМЙФШ УМЕДХАЭЙЕ РТПГЕДХТЩ:

Create - уПЪДБЕФ ЖБКМ У ХЛБЪБООЩН ЙНЕОЕН Й ТЕЦЙНПН ЙУРПМШЪПЧБОЙС. рТЙНЕЮБФЕМШОП, ЮФП ЕУМЙ ЖБКМ ЙНЕЕФ УФТПЛХ null, ФП ЖБКМ СЧМСЕФУС ЧТЕНЕООЩН Й РПЪДОЕЕ ВХДЕФ ХДБМЕО.
Open - пФЛТЩЧБЕФ ЖБКМ У ХЛБЪБООЩН ЙНЕОЕН Й ТЕЦЙНПН ЙУРПМШЪПЧБОЙС.
Delete - хДБМСЕФ ХЛБЪБООЩК ЖБКМ. рТЙ РПРЩФЛЕ ХДБМЙФШ ПФЛТЩФЩК ЖБКМ РТПЙУИПДЙФ ПЫЙВЛБ.
Reset - чПЪЧТБЭБЕФ РПЪЙГЙА ЮФЕОЙС (ЙМЙ ЪБРЙУЙ) Ч ОБЮБМП ЖБКМБ.

л ОБЙВПМЕЕ ЮБУФП ЙУРПМШЪХЕНЩН ЖХОЛГЙСН РБЛЕФБ Ada.Text_IO, ЛПФПТЩЕ ЧПЪЧТБЭБАФ УФБФХУ УЙУФЕНЩ ЖБКМПЧПЗП ПВНЕОБ, НПЦОП ПФОЕУФЙ УМЕДХАЭЙЕ ЖХОЛГЙЙ:

End_of_File - чПЪЧТБЭБЕФ ЙУФЙОХ ЕУМЙ НЩ ОБИПДЙНУС Ч ЛПОГЕ ФЕЛХЭЕЗП ЖБКМБ.
End_of_Line - чПЪЧТБЭБЕФ ЙУФЙОХ ЕУМЙ НЩ ОБИПДЙНУС Ч ЛПОГЕ ФЕЛХЭЕК УФТПЛЙ ФЕЛУФБ.
Is_Open - чПЪЧТБЭБЕФ ЙУФЙОХ ЕУМЙ ФЕЛХЭЙК ЖБКМ ПФЛТЩФ.
Mode - чПЪЧТБЭБЕФ ТЕЦЙН ЙУРПМШЪПЧБОЙС ФЕЛХЭЕЗП ЖБКМБ.
Name - чПЪЧТБЭБЕФ УФТПЛХ ЙНЕОЙ ФЕЛХЭЕЗП ЖБКМБ.

ъБНЕФЙН, ЮФП УРЙУПЛ РЕТЕЮЙУМЕООЩИ ЪДЕУШ РПДРТПЗТБНН ДБМЕЛП ОЕ РПМПО Й ЙНЕЕФ МЙЫШ ПЪОБЛПНЙФЕМШОЩК ИБТБЛФЕТ. рПЬФПНХ, ДМС РПМХЮЕОЙС ВПМЕЕ РПДТПВОЩИ УЧЕДЕОЙК МХЮЫЕ ЧУЕЗП ОЕРПУТЕДУФЧЕООП ПВТБФЙФШУС Л УРЕГЙЖЙЛБГЙЙ РБЛЕФБ Ada.Text_IO.

11.1.2 йУЛАЮЕОЙС ЧЧПДБ/ЧЩЧПДБ


чУЕ УТЕДУФЧБ ПТЗБОЙЪБГЙЙ ЧЧПДБ/ЧЩЧПДБ бДЩ РПМБЗБАФУС ОБ НЕИБОЙЪН ЙУЛМАЮЕОЙК ДМС УППВЭЕОЙС ПВ ПЫЙВЛБИ, ЛПФПТЩЕ ЧПЪОЙЛМЙ Ч РТПГЕУУЕ ЧЩРПМОЕОЙС ЛБЛПК-МЙВП ПРЕТБГЙЙ ЧЧПДБ/ЧЩЧПДБ ДБООЩИ. пРЙУБОЙС ЙУЛМАЮЕОЙК ЧЧПДБ/ЧЩЧПДБ ОБИПДСФУС Ч РБЛЕФЕ Ada.IO_Exceptions ЛПФПТЩК ЙНЕЕФ УМЕДХАЭЙК ЧЙД:

фБЛЙН ПВТБЪПН, РПРЩФЛБ УПЪДБФШ ЖБКМ, ЛПФПТЩК ХЦЕ УХЭЕУФЧХЕФ, ЧЩЪЩЧБЕФ ЙУЛМАЮЕОЙЕ, ФБЛЦЕ ЛБЛ Й РПРЩФЛБ ПФЛТЩФШ ЖБКМ ЛПФПТПЗП ОЕФ.

рПЛБЪБООБС ОЙЦЕ РТПГЕДХТБ Robust_Open СЧМСЕФУС РТЙНЕТПН ФПЗП, ЛБЛ НПЦОП РПРЩФБФШУС ЙЪВЕЦБФШ РПДПВОЩЕ ОЕРТЙСФОПУФЙ. уОБЮБМБ, ПОБ РЩФБЕФУС ПФЛТЩФШ ХЛБЪБООЩК ЖБКМ, Й ЕУМЙ ЬФП РТЙЧПДЙФ Л ПЫЙВЛЕ ЗПЧПТСЭЕК ПВ ПФУХФУФЧЙЙ ЬФПЗП ЖБКМБ, ФП ФПЗДБ ПОБ РЩФБЕФУС ЕЗП УПЪДБФШ:

уМЕДХЕФ ПВТБФЙФШ ЧОЙНБОЙЕ ОБ ФП, ЮФП ОБ ЛПТТЕЛФОПУФШ ТБВПФЩ ЬФПЗП РТЙНЕТБ НПЦЕФ ПЛБЪБФШ ЧМЙСОЙЕ ПДОПЧТЕНЕООПЕ ЧЩРПМОЕОЙЕ ОЕУЛПМШЛЙИ РТПГЕУУПЧ. дЕКУФЧЙФЕМШОП, ЧЩРПМОЕОЙЕ РТПЗТБННЩ НПЦЕФ ВЩФШ РТЙПУФБОПЧМЕОП РПУМЕ РПРЩФЛЙ ПФЛТЩФШ ЖБКМ, ОП ДП ФПЗП ЛБЛ ПОБ РПРЩФБЕФУС ЕЗП УПЪДБФШ. уМЕДПЧБФЕМШОП, ЕУФШ ЧЕТПСФОПУФШ ФПЗП, ЮФП ЪБ ЧТЕНС РТПУФПС РТПЗТБННЩ ЬФПФ ЖБКМ ВХДЕФ УПЪДБО ДТХЗЙН РТПГЕУУПН.

рТЙНЕТПН ЕЭЕ ПДОПК РТПУФПК ХФЙМЙФЩ НПЦЕФ УМХЦЙФШ МПЗЙЮЕУЛБС ЖХОЛГЙС File_Exists, ЛПФПТБС РПЪЧПМСЕФ ПУХЭЕУФЧЙФШ РТПЧЕТЛХ УХЭЕУФЧПЧБОЙС ЖБКМБ:

ьФБ ЖХОЛГЙС РЩФБЕФУС ПФЛТЩФШ ЖБКМ Й ЕУМЙ РТЙ ЬФПН ОЕ ЧПЪОЙЛБЕФ ЙУЛМАЮЕОЙС Name_Error, ФП ЬФП ЪОБЮЙФ ЮФП ЖБКМ УХЭЕУФЧХЕФ, Й ЖХОЛГЙС ЧПЪЧТБЭБЕФ ЪОБЮЕОЙЕ "ЙУФЙОБ" (ЕУМЙ ЖБКМ ХЦЕ ПФЛТЩФ, ФП ЗЕОЕТЙТХЕФУС ЙУЛМАЮЕОЙЕ Use_Error).

11.1.3 жБКМЩ ЧЧПДБ/ЧЩЧПДБ РП ХНПМЮБОЙА

ч ФЕИ УМХЮБСИ, ЛПЗДБ ДМС ПУХЭЕУФЧМЕОЙС ЧЧПДБ/ЧЩЧПДБ ОЕФ ЮЕФЛПЗП ХЛБЪБОЙС ЧОЕЫОЙИ ЖБКМПЧ ЙУРПМШЪХАФУС ЖБКМЩ ЧЧПДБ/ЧЩЧПДБ РП ХНПМЮБОЙА. рТЙ ЬФПН, УППФЧЕФУФЧХАЭЙЕ ЖБКМ ЧЧПДБ Й ЖБКМ ЧЩЧПДБ РП ХНПМЮБОЙА ЧУЕЗДБ ПФЛТЩФЩ РЕТЕД ОБЮБМПН ЧЩРПМОЕОЙС РТПЗТБННЩ Й УЧСЪБОЩ У ДЧХНС, ПРТЕДЕМСЕНЩНЙ ТЕБМЙЪБГЙЕК УЙУФЕНЩ, ЧОЕЫОЙНЙ ЖБКМБНЙ. дТХЗЙЕ ДПУФБФПЮОП ЫЙТПЛП ТБУРТПУФТБОЕООЩЕ ОБЪЧБОЙС ЬФЙИ ЖБКМПЧ: УФБОДБТФОЩК ЧЧПД Й УФБОДБТФОЩК ЧЩЧПД, ЙМЙ УФБОДБТФОПЕ ХУФТПКУФЧП ЧЧПДБ Й УФБОДБТФОПЕ ХУФТПКУФЧП ЧЩЧПДБ. уФБОДБТФ Ada95, ЛТПНЕ ЬФПЗП, ДПВБЧЙМ БОБМПЗЙЮОХА ЛПОГЕРГЙА УФБОДБТФОПЗП ЖБКМБ ПЫЙВПЛ, РПЪБЙНУФЧПЧБЧ ЬФХ ЙДЕА ПФ Unix/C.

лБЛ РТБЧЙМП, ЖБКМ УФБОДБТФОПЗП ЧЧПДБ - ЬФП ЛМБЧЙБФХТБ, Б ЖБКМЩ УФБОДБТФОПЗП ЧЩЧПДБ Й УФБОДБТФОПЗП ЖБКМБ ПЫЙВПЛ - ЬФП ДЙУРМЕК. рБЛЕФ Ada.Text_IO РТЕДПУФБЧМСЕФ УТЕДУФЧБ ЛПФПТЩЕ РПЪЧПМСАФ РТПЗТБННОП ПРТЕДЕМСФШ Й РЕТЕПРТЕДЕМСФШ ХУФБОПЧМЕООЩЕ РП ХНПМЮБОЙА ЖБКМЩ ЧЧПДБ/ЧЩЧПДБ.

жХОЛГЙЙ РБЛЕФБ Ada.Text_IO, ЛПФПТЩЕ РПЪЧПМСАФ ПРТЕДЕМЙФШ УФБОДБТФОЩЕ ЖБКМ ЧЧПДБ, ЖБКМ ЧЩЧПДБ Й ЖБКМ ПЫЙВПЛ, Б ФБЛЦЕ ЖБКМ ЧЧПДБ, ЖБКМ ЧЩЧПДБ Й ЖБКМ ПЫЙВПЛ ЙУРПМШЪХЕНЩЕ Ч ФЕЛХЭЙК НПНЕОФ ЙНЕАФ УППФЧЕФУФЧЕООЩЕ ЙНЕОБ:

фБЛЙЕ ЖХОЛГЙЙ ЧПЪЧТБЭБАФ ЪОБЮЕОЙС ФЙРБ File_Type ЙМЙ File_Access (ЙУРПМШЪХЕФУС НЕИБОЙЪН УПЧНЕЭЕОЙС ЙНЕО ЖХОЛГЙК).

дМС РЕТЕПРТЕДЕМЕОЙС ЙУРПМШЪХЕНЩИ Ч ФЕЛХЭЙК НПНЕОФ ЖБКМПЧ ЧЧПДБ, ЧЩЧПДБ Й ПЫЙВПЛ, РБЛЕФ Ada.Text_IO ПВЕУРЕЮЙЧБЕФ РТПГЕДХТЩ УП УМЕДХАЭЙНЙ ЙНЕОБНЙ:

ч ЛБЮЕУФЧЕ РБТБНЕФТБ, ЬФЙ РТПГЕДХТЩ ЙУРПМШЪХАФ ЪОБЮЕОЙС ФЙРБ File_Type, РТЙЮЕН, ХЛБЪЩЧБЕНЩК ЖБКМ ДПМЦЕО ВЩФШ РТЕДЧБТЙФЕМШОП ПФЛТЩФ.

11.1.4 оБУФТБЙЧБЕНЩЕ РБЛЕФЩ ФЕЛУФПЧПЗП ЧЧПДБ/ЧЩЧПДБ

дМС РПДДЕТЦЛЙ ФЕЛУФПЧПЗП ЧЧПДБ/ЧЩЧПДБ ЮЙУМЕООЩИ ДБООЩИ Й ДБООЩИ РЕТЕЮЙУМЙНЩИ ФЙРПЧ бДБ РТЕДХУНБФТЙЧБЕФ ОБВПТ ОБУФТБЙЧБЕНЩИ РБЛЕФПЧ ФЕЛУФПЧПЗП ЧЧПДБ/ЧЩЧПДБ:

рТЙНЕЮБФЕМШОП, ЮФП ЧУЕ ЬФЙ ОБУФТБЙЧБЕНЩЕ РБЛЕФЩ СЧМСАФУС ДПЮЕТОЙНЙ НПДХМСНЙ РБЛЕФБ Ada.Text_IO.

иПФС ЬФЙ ОБУФТБЙЧБЕНЩЕ НПДХМЙ РТЕДОБЪОБЮЕОЩ ДМС ПТЗБОЙЪБГЙЙ ЧЧПДБ/ЧЩЧПДБ ЪОБЮЕОЙК ТБЪМЙЮОЩИ ФЙРПЧ, УРЕГЙЖЙЛБГЙЙ ЬФЙИ НПДХМЕК ДПУФБФПЮОП РПДПВОЩ. фБЛЙН ПВТБЪПН, УРЕГЙЖЙЛБГЙС МАВПЗП ЙЪ ЬФЙИ НПДХМЕК, ЙУРПМШЪХС НЕИБОЙЪН УПЧНЕЭЕОЙС ЙНЕО РПДРТПЗТБНН, РТЕДПУФБЧМСЕФ ПРЙУБОЙС ФТЕИ ЧЕТУЙК ОБУФТБЙЧБЕНЩИ РТПГЕДХТ Get Й ФТЕИ ЧЕТУЙК ОБУФТБЙЧБЕНЩИ РТПГЕДХТ Put, ЛПФПТЩЕ НПЦОП ТБЪДЕМЙФШ РПРБТОП. рЕТЧБС РБТБ РТПГЕДХТ Get Й Put УППФЧЕФУФЧЕООП РТЕДОБЪОБЮЕОБ ДМС ЮФЕОЙС Й ЪБРЙУЙ ЪОБЮЕОЙК У ХУФТПКУФЧ УФБОДБТФОПЗП ЧЧПДБ/ЧЩЧПДБ, ЧФПТБС - ДМС БОБМПЗЙЮОПЗП ЧЪБЙНПДЕКУФЧЙС У ЧОЕЫОЙНЙ ЖБКМБНЙ, Б ФТЕФШС ДМС РТЕПВТБЪПЧБОЙС ЪОБЮЕОЙК Ч УФТПЛПЧПЕ РТЕДУФБЧМЕОЙЕ Й ПВТБФОП. дМС РПМХЮЕОЙС ЙУЮЕТРЩЧБАЭЕК ЙОЖПТНБГЙЙ МХЮЫЕ ОЕРПУТЕДУФЧЕООП ПВТБФЙФШУС Л УРЕГЙЖЙЛБГЙСН ЬФЙИ ОБУФТБЙЧБЕНЩИ НПДХМЕК.

тБУУНПФТЙН РТЙНЕТ ЙУРПМШЪПЧБОЙС ОБУФТБЙЧБЕНПЗП РБЛЕФБ Ada.Text_IO.Integer_IO, ЛПФПТЩК РТЕДОБЪОБЮЕО ДМС ПТЗБОЙЪБГЙЙ ЧЧПДБ/ЧЩЧПДБ ГЕМПЮЙУМЕООЩИ ФЙРПЧ. рТЕДЧБТЙФЕМШОП, ОЕПВИПДЙНП ЧЩРПМОЙФШ ЛПОЛТЕФЙЪБГЙА ОБУФТБЙЧБЕНПЗП РБЛЕФБ Ada.Text_IO.Integer_IO ДМС УППФЧЕФУФЧХАЭЕЗП ГЕМПЮЙУМЕООПЗП ФЙРБ (Ч ОБЫЕН УМХЮБЕ ЧЩВТБО ФЙР Integer, ДМС РТПУФПФЩ), Й РПМХЮЙФШ ЬЛЪЕНРМСТ ОБУФТПЕООПЗП НПДХМС:

фЕРЕТШ НЩ НПЦЕН ЙУРПМШЪПЧБФШ РПМХЮЕООЩК ЬЛЪЕНРМСТ ОБУФТПЕООПЗП НПДХМС Int_IO, ОБРТЙНЕТ, УМЕДХАЭЙН ПВТБЪПН:

ъДЕУШ, РТПГЕДХТБ Create УПЪДБЕФ ЖБКМ ДБООЩИ "data.dat", РПУМЕ ЮЕЗП, Ч ЬФПФ ЖБКМ РТПЙЪЧПДЙФУС ЪБРЙУШ ОЕЛПФПТЩИ ДБООЩИ РТПГЕДХТБНЙ Put Й New_Line. рТПГЕДХТБ Close ЪБЛТЩЧБЕФ ЖБКМ.

пУФБМШОЩЕ ЧЩЫЕРЕТЕЮЙУМЕООЩЕ ОБУФТБЙЧБЕНЩЕ РБЛЕФЩ НПЗХФ ВЩФШ ЙУРПМШЪПЧБОЩ БОБМПЗЙЮОЩН ПВТБЪПН.

уМЕДХЕФ ДПВБЧЙФШ, ЮФП Ч ДПРПМОЕОЙЕ Л ОБУФТБЙЧБЕНЩН РБЛЕФБН, бДБ ФБЛЦЕ РТЕДПУФБЧМСЕФ ОБВПТ ОБУФТПЕООЩИ РБЛЕФПЧ:

рЕТЧЩЕ РСФШ РЕТЕЮЙУМЕООЩИ РБЛЕФПЧ, СЧМСАФУС ТЕЪХМШФБФБНЙ ЛПОЛТЕФЙЪБГЙЙ ОБУФТБЙЧБЕНПЗП РБЛЕФБ Ada.Text_IO.Integer_IO ДМС ЙУРПМШЪПЧБОЙС УП ЪОБЮЕОЙСНЙ УППФЧЕФУФЧХАЭЙИ ГЕМПЮЙУМЕООЩИ ФЙРПЧ, РПУМЕДОЙЕ ЮЕФЩТЕ - ТЕЪХМШФБФБНЙ УППФЧЕФУФЧХАЭЙИ ЛПОЛТЕФЙЪБГЙК ОБУФТБЙЧБЕНПЗП РБЛЕФБ Ada.Text_IO.Float_IO.

11.2 чЧПД/ЧЩЧПД ДЧПЙЮОЩИ ДБООЩИ

лБЛ РТБЧЙМП, УПЧТЕНЕООЩЕ РТПЙЪЧПДЙФЕМШОЩЕ УЙУФЕНЩ ПВТБВПФЛЙ ВПМШЫЙИ ПВЯЕНПЧ ДБООЩИ ОЕ ЙУРПМШЪХАФ ФЕЛУФ ДМС УПИТБОЕОЙС ЙОЖПТНБГЙЙ Ч УЧПЙИ ЖБКМБИ. ьФП ЪОБЮЙФ, ЮФП ЧНЕУФП ФЕЛУФБ, Ч ГЕМСИ РПЧЩЫЕОЙС РТПЙЪЧПДЙФЕМШОПУФЙ, ЖБКМЩ ДБООЩИ ФБЛЙИ УЙУФЕН ПВЩЮОП ЙУРПМШЪХАФ ДЧПЙЮОПЕ РТЕДУФБЧМЕОЙЕ. ч ЬФПН УМХЮБЕ ЖБКМЩ УПУФПСФ ЙЪ ЛПНРПЪЙФОЩИ ПВЯЕЛФПЧ, ЛПФПТЩНЙ ЮБЭЕ ЧУЕЗП СЧМСАФУС ЪБРЙУЙ.

ч ЛБЮЕУФЧЕ ПУОПЧЩ ДМС ПТЗБОЙЪБГЙЙ ЧЧПДБ/ЧЩЧПДБ ДЧПЙЮОЩИ ДБООЩИ бДБ РТЕДХУНБФТЙЧБЕФ ОБУФТБЙЧБЕНЩЕ РБЛЕФЩ Ada.Sequential_IO Й Ada.Direct_IO. у РПНПЭША ЬФЙИ РБЛЕФПЧ НПЦОП РПУФТПЙФШ ТБВПФХ У ДЧПЙЮОЩНЙ ЖБКМБНЙ, УПУФПСЭЙНЙ ЙЪ ПДОПФЙРОЩИ ПВЯЕЛФПЧ ПДЙОБЛПЧПК ДМЙОЩ (ЪБРЙУЙ, НБУУЙЧЩ, ЮЙУМБ У РМБЧБАЭЕК ФПЮЛПК . ).

11.2.1 рБЛЕФ Ada.Sequential_IO

уФБОДБТФОЩК ОБУФТБЙЧБЕНЩК РБЛЕФ Ada.Sequential_IO РПЪЧПМСЕФ ОБН УПЪДБЧБФШ ЖБКМЩ, УПУФПСЭЙЕ ЙЪ ЛПНРПОЕОФПЧ МАВПЗП ФЙРБ. рТЙ ЬФПН, ДПМЦОП УПВМАДБФШУС ЕДЙОУФЧЕООПЕ ХУМПЧЙЕ: ФЙР ЛПНРПОЕОФПЧ ДПМЦЕО ВЩФШ ПЗТБОЙЮЕО (constrained).

вБЪПЧПЕ УПДЕТЦЙНПЕ ОБУФТБЙЧБЕНПЗП РБЛЕФБ Ada.Sequential_IO ЙДЕОФЙЮОП РБЛЕФХ Ada.Text_IO, ЪБ ЙУЛМАЮЕОЙЕН ФПЗП, ЮФП РТПГЕДХТЩ Get Й Put УППФЧЕФУФЧЕООП ЪБНЕОЕОЩ РТПГЕДХТБНЙ Read Й Write, Й ЬФЙ РТПГЕДХТЩ ВХДХФ ТБВПФБФШ У ФЙРПН ДБООЩИ ДМС ЛПФПТПЗП ВЩМБ РТПЙЪЧЕДЕОБ ЛПОЛТЕФЙЪБГЙС ОБУФТБЙЧБЕНПЗП РБЛЕФБ. лТПНЕ ЬФПЗП, ПФУХФУФЧХЕФ РПОСФЙЕ УФТПЛЙ ФЕЛУФБ, Й, УМЕДПЧБФЕМШОП, ОЕФ ЖХОЛГЙЙ End_Of_Line Й РТПГЕДХТ Skip_Line, New_Line.

рТЙНЕТПН ЙУРПМШЪПЧБОЙС ЬФПЗП РБЛЕФБ НПЦЕФ УМХЦЙФШ УМЕДХАЭЕЕ:

ъБНЕФЙН, ЮФП Ч ДБООПН РТЙНЕТЕ НЩ ОЕ БЛГЕОФЙТХЕН ЧОЙНБОЙЕ ОБ УПДЕТЦЙНПН РБЛЕФБ Personnel_Details, Б ФПМШЛП ХЛБЪЩЧБЕН Ч ЛПННЕОФБТЙЙ, ЮФП ПО ПРЙУЩЧБЕФ ФЙР ЪБРЙУЙ Personnel.

рПУМЕ ПФЛТЩФЙС ЖБКМБ, ПО РПУМЕДПЧБФЕМШОП ПВТБВБФЩЧБЕФУС ПФ РПЪЙГЙЙ ОБЮБМБ ЖБКМБ, Й ДП ФЕИ РПТ, РПЛБ ОЕ ВХДЕФ ДПУФЙЗОХФ ЛПОЕГ ЖБКМБ, ЙМЙ ВХДЕФ ЧЩРПМОЕОБ ПДОБ ЙЪ РТПГЕДХТ Reset ЙМЙ Close. рТСНПК ДПУФХР Л ЬМЕНЕОФБН ЖБКМБ ОЕ ЧПЪНПЦЕО (ПФУАДБ Й ОБЪЧБОЙЕ: Ada.Sequential - РПУМЕДПЧБФЕМШОЩК).


11.2.2 рБЛЕФ Ada.Direct_IO

рБЛЕФ Ada.Direct_IO РПУФТПЕО РПЧЕТИ РБЛЕФБ Ada.Sequential_IO. пО РТЕДХУНБФТЙЧБЕФ ЧПЪНПЦОПУФШ РТСНПЗП ПВТБЭЕОЙС Л ОЕПВИПДЙНПК ЪБРЙУЙ Ч ЖБКМЕ, ПРТЕДЕМЕОЙС ТБЪНЕТБ ЖБКМБ Й ПРТЕДЕМЕОЙС ФЕЛХЭЕЗП ЙОДЕЛУБ. лТПНЕ ЬФПЗП, ПО ДПРПМОЙФЕМШОП РПЪЧПМСЕФ ПФЛТЩЧБФШ ЖБКМЩ Ч ТЕЦЙНЕ - Inout_File (ЮФЕОЙЕ/ЪБРЙУШ). фБЛЙЕ УТЕДУФЧБ, Ч УПЧПЛХРОПУФЙ У РПДИПДСЭЙН ЙОДЕЛУЙТХАЭЙН РБЛЕФПН, ДПМЦОЩ РПЪЧПМСФШ РПУФТПЕОЙЕ РБЛЕФБ ЖБКМПЧПК ПВТБВПФЛЙ ПЮЕОШ ЧЩУПЛПЗП ХТПЧОС.

уМЕДХАЭЙК РТЙНЕТ ДЕНПОУФТЙТХЕФ ЙУРПМШЪПЧБОЙЕ ЖБКМПЧ У РТСНЩН ДПУФХРПН:

ъДЕУШ, ДМС ЛТБФЛПУФЙ РПДТБЪХНЕЧБЕФУС, ЮФП ЪБРЙУЙ П УМХЦБЭЙИ УПИТБОСАФУС Ч РПТСДЛЕ ОПНЕТПЧ УМХЦБЭЙИ - Employee_No.

фБЛЦЕ ЪБНЕФЙН, ЮФП НЩ ОЕ БЛГЕОФЙТХЕН ЧОЙНБОЙЕ ОБ УПДЕТЦЙНПН ЧОЕЫОЙИ НПДХМЕК: РБЛЕФЕ Personnel_Details Й РТПГЕДХТЕ Display_Menu.

11.3 рПФПЛЙ ЧЧПДБ/ЧЩЧПДБ

уФБОДБТФ Ada95 ПВПЗБФЙМ УТЕДУФЧБ ЧЧПДБ/ЧЩЧПДБ бДЩ ЧПЪНПЦОПУФША ЙУРПМШЪПЧБОЙС ЗЕФЕТПЗЕООЩИ (УПУФПСЭЙИ ЙЪ ТБЪМЙЮОЩИ РП УПУФБЧХ, УЧПКУФЧБН, РТПЙУИПЦДЕОЙА ЮБУФЕК) РПФПЛПЧ ЧЧПДБ/ЧЩЧПДБ. пУОПЧОБС ЙДЕС ЬФПЗП РПДИПДБ ЪБЛМАЮБЕФУС Ч ФПН, ЮФП УХЭЕУФЧХЕФ РПФПЛ ДБООЩИ ЛПФПТЩК БУУПГЙЙТХЕФУС У ЛБЛЙН-МЙВП ЖБКМПН. ъБ УЮЕФ ЙУРПМШЪПЧБОЙС РПФПЛПЧЩИ НЕИБОЙЪНПЧ, ПВТБВПФЛБ ФБЛПЗП ЖБКМБ НПЦЕФ ВЩФШ ЧЩРПМОЕОБ РПУМЕДПЧБФЕМШОП, РПДПВОПAda.Sequential_IO, ЙМЙ РПЪЙГЙПООП, РПДПВОП Ada.Direct_IO. рТЙЮЕН, Ч ПФМЙЮЙЕ ФТБДЙГЙПООЩИ УТЕДУФЧ ЖБКМПЧПЗП ЧЧПДБ ЧЩЧПДБ ЛПФПТЩЕ ПВЕУРЕЮЙЧБАФУС РБЛЕФБНЙ Ada.Sequential_IO Й Ada.Direct_IO, ПДЙО Й ФПФ ЦЕ РПФПЛ РПЪЧПМСЕФ ЧЩРПМОСФШ ЮФЕОЙЕ/ЪБРЙУШ ДМС ДБООЩИ ТБЪМЙЮОПЗП ФЙРБ. дМС ПВЕУРЕЮЕОЙС РПДДЕТЦЛЙ НЕИБОЙЪНПЧ РПФПЛПЧПЗП ЧЧПДБ/ЧЩЧПДБ бДБ РТЕДПУФБЧМСЕФ УФБОДБТФОЩК РБЛЕФ Ada.Streams.Stream_IO.

рТЕЦДЕ ЮЕН РТЙУФХРЙФШ Л ДЕФБМШОПНХ ТБУУНПФТЕОЙА РПФПЛПЧЩИ НЕИБОЙЪНПЧ, ОЕПВИПДЙНП ЪБНЕФЙФШ, ЮФП ПОЙ ДПУФБФПЮОП ФЕУОП УЧСЪБОЩ У ФЬЗПЧЩНЙ ФЙРБНЙ, ЛПФПТЩЕ ДП ОБУФПСЭЕЗП НПНЕОФБ ОЕ ВЩМЙ ТБУУНПФТЕОЩ. рПЬФПНХ, РТЙ РЕТЧПН ПЪОБЛПНМЕОЙЙ У бДПК, ТБУУНПФТЕОЙЕ РПДДЕТЦЛЙ ЧЧПДБ/ЧЩЧПДБ ОБ РПФПЛБИ НПЦОП РТПРХУФЙФШ, Й ЧЕТОХФШУС Л ОЕНХ РПУМЕ ПЪОБЛПНМЕОЙС У ФЬЗПЧЩНЙ ФЙРБНЙ.

рБЛЕФ Ada.Streams.Stream_IO РТЕДПУФБЧМСЕФ УТЕДУФЧБ ЛПФПТЩЕ РПЪЧПМСАФ УПЪДБЧБФШ, ПФЛТЩЧБФШ Й ЪБЛТЩЧБФШ ЖБКМЩ ПВЩЮОЩН ПВТБЪПН. дБМЕЕ, ЖХОЛГЙС Stream, ЛПФПТБС Ч ЛБЮЕУФЧЕ РБТБНЕФТБ РТЙОЙНБЕФ ЪОБЮЕОЙЕ ФЙРБ File_Type (РПФПЛПЧЩК ЖБКМ), РПЪЧПМСЕФ РПМХЮЙФШ ДПУФХР Л РПФПЛХ БУУПГЙЙТХЕНПНХ У ЬФЙН ЖБКМПН. уИЕНБФЙЮЕУЛЙ, ОБЮБМП УРЕГЙЖЙЛБГЙЙ ЬФПЗП РБЛЕФБ ЙНЕЕФ УМЕДХАЭЙК ЧЙД:

ъБНЕФЙН, ЮФП ЧУЕ ПВЯЕЛФЩ РПФПЛПЧПЗП ФЙРБ СЧМСАФУС РТПЙЪЧПДОЩНЙ ПФ БВУФТБЛФОПЗП ФЙРБ Ada.Streams.Root_Stream_Type Й ПВЩЮОП РПМХЮБАФ ДПУФХР Л РПФПЛХ ЮЕТЕЪ РБТБНЕФТ ЛПФПТЩК УУЩМБЕФУС ОБ ПВЯЕЛФ ФЙРБ Ada.Streams.Root_Stream_Type'Class.

рПУМЕДПЧБФЕМШОБС ПВТБВПФЛБ РПФПЛПЧ ЧЩРПМОСЕФУС У РПНПЭША БФТЙВХФПЧ 'Read, 'Write, 'Input Й 'Output. ьФЙ БФТЙВХФЩ РТЕДПРТЕДЕМЕОЩ ДМС ЛБЦДПЗП ОЕМЙНЙФЙТПЧБООПЗП ФЙРБ. уМЕДХЕФ ЪБНЕФЙФШ, ЮФП бДБ, У РПНПЭША ЙОУФТХЛГЙЙ ПРЙУБОЙС БФТЙВХФБ, РТЕДПУФБЧМСЕФ РТПЗТБННЙУФХ ЧПЪНПЦОПУФШ РЕТЕПРТЕДЕМЕОЙС ЬФЙИ БФТЙВХФПЧ. фБЛЙН ПВТБЪПН, РТЙ ОЕПВИПДЙНПУФЙ, НЩ НПЦЕН РЕТЕПРТЕДЕМСФШ БФТЙВХФЩ ЛПФПТЩЕ ХУФБОПЧМЕОЩ РП ХНПМЮБОЙА Й ПРЙУЩЧБФШ БФТЙВХФЩ ДМС МЙНЙФЙТПЧБООЩИ ФЙРПЧ.

бФТЙВХФЩ T'Read Й T'Write РТЙОЙНБАФ РБТБНЕФТЩ ЛПФПТЩЕ ХЛБЪЩЧБАФ ЙУРПМШЪХЕНЩК РПФПЛ Й ЬМЕНЕОФ ФЙРБ T УМЕДХАЭЙН ПВТБЪПН:

ч ЛБЮЕУФЧЕ РТПУФПЗП РТЙНЕТБ, ТБУУНПФТЙН УМХЮБК, ЛПЗДБ ОБН ОЕПВИПДЙНП ЧЩРПМОЙФШ ЪБРЙУШ Ч РПФПЛ ЪОБЮЕОЙС ФЙРБ Date, ПРЙУБОЙЕ ЛПФПТПЗП ЙНЕЕФ ЧЙД:

уОБЮБМБ, НЩ УПЪДБЕН ЖБКМ (ЙУРПМШЪХС ПВЩЮОЩК РПДИПД) Й РПМХЮБЕН ДПУФХР Л БУУПГЙЙТПЧБООПНХ У ОЙН РПФПЛХ. ъБФЕН, НЩ НПЦЕН ЧЩЪЧБФШ РТПГЕДХТХ БФТЙВХФБ ДМС ЪОБЮЕОЙС ЛПФПТПЕ ОЕПВИПДЙНП ЪБРЙУБФШ Ч РПФПЛ:

рТЙНЕЮБФЕМШОП, ЮФП РБЛЕФ Streams.Stream_IO ОЕ СЧМСЕФУС ОБУФТБЙЧБЕНЩН РБЛЕФПН Й, ФБЛЙН ПВТБЪПН, ОЕ ОХЦДБЕФУС Ч ЛПОЛТЕФЙЪБГЙЙ. чУЕ РПДПВОЩЕ ЗЕФЕТПЗЕООЩЕ ЖБКМЩ ЙНЕАФ ПДЙО Й ФПФ ЦЕ ФЙР. ъБРЙУБООЩК ФБЛЙН ПВТБЪПН ЖБКМ, НПЦЕФ ВЩФШ РТПЮЙФБО БОБМПЗЙЮОЩН ПВТБЪПН. пДОБЛП, ОЕПВИПДЙНП ЪБНЕФЙФШ, ЮФП ЕУМЙ НЩ РПРЩФБЕНУС РТПЮЙФБФШ ЪБРЙУБООЩЕ ДБООЩЕ ЙУРПМШЪХС ОЕ РПДИПДСЭХА ДМС ЬФЙИ ДБООЩИ РПДРТПЗТБННХ, ФП НЩ РПМХЮЙН ПЫЙВЛХ Data_Error.

ч УМХЮБЕ РТПУФПК ЪБРЙУЙ, ФБЛПК ЛБЛ Date, РТЕДПРТЕДЕМЕООЩК БФТЙВХФ Date'Write ВХДЕФ РПУМЕДПЧБФЕМШОП ЧЩЪЩЧБФШ БФТЙВХФЩ 'Write ДМС ЛБЦДПЗП ЛПНРПОЕОФБ Date. ьФП ЧЩЗМСДЙФ УМЕДХАЭЙН ПВТБЪПН:

нЩ НПЦЕН ОБРЙУБФШ УЧПА УПВУФЧЕООХА ЧЕТУЙА ДМС Date'Write. рТЕДРПМПЦЙН, ЮФП ОБН ОЕПВИПДЙНП ПУХЭЕУФЧМСФШ ЧЩЧПД ЙНЕОЙ НЕУСГБ Ч ЧЙДЕ УППФЧЕФУФЧХАЭЕЗП ГЕМПЗП ЪОБЮЕОЙС:

ФПЗДБ, УМЕДХАЭБС ЙОУФТХЛГЙС

ВХДЕФ ЙУРПМШЪПЧБФШ ОПЧЩК ЖПТНБФ ДМС ЧЩЧПДБ ЪОБЮЕОЙК ФЙРБ Date.

бОБМПЗЙЮОЩЕ ЧПЪНПЦОПУФЙ РТЕДХУНБФТЙЧБАФУС ДМС ПУХЭЕУФЧМЕОЙС ЧЧПДБ. ьФП ЪОБЮЙФ, ЮФП ЕУМЙ ОБН ОЕПВИПДЙНП РТПЮЙФБФШ ЪОБЮЕОЙЕ ФЙРБ Date, ФП ФЕРЕТШ ОБН ОХЦОП ПРЙУБФШ ДПРПМОЙФЕМШОХА ЧЕТУЙА Date'Read ДМС ЧЩРПМОЕОЙС ЮФЕОЙС ГЕМЩИ ЪОБЮЕОЙК ЛБЛ ЪОБЮЕОЙК НЕУСГБ У РПУМЕДХАЭЕК ЛПОЧЕТУЙЕК ЬФЙИ ЪОБЮЕОЙК Ч ЪОБЮЕОЙС ФЙРБ Month_Name.

рТЙНЕЮБФЕМШОП, ЮФП НЩ ЙЪНЕОЙМЙ ЖПТНБФ ЧЩЧПДБ Month_Name ФПМШЛП ДМС УМХЮБС Date. еУМЙ ОБН ОХЦОП ЙЪНЕОЙФШ ЖПТНБФ ЧЩЧПДБ Month_Name ДМС ЧУЕИ УМХЮБЕЧ, ФП ТБЪХНОЕЕ РЕТЕПРТЕДЕМЙФШ Month_Name'Write ЮЕН Date'Write. фПЗДБ, ЬФП РТПЙЪЧЕДЕФ Л ЛПУЧЕООПНХ ЙЪНЕОЕОЙА ЖПТНБФБ ЧЩЧПДБ ДМС ФЙРБ Date.

Илон Маск рекомендует:  Что такое код domnode >is_blank_node

уМЕДХЕФ ПВТБФЙФШ ЧОЙНБОЙЕ ОБ ФП, ЮФП РТЕДПРТЕДЕМЕООЩЕ БФТЙВХФЩ T'Read Й T'Write, НПЗХФ ВЩФШ РЕТЕПРТЕДЕМЕОЩ ЙОУФТХЛГЙЕК ПРТЕДЕМЕОЙС БФТЙВХФБ ФПМШЛП Ч ФПН ЦЕ УБНПН РБЛЕФЕ (Ч УРЕГЙЖЙЛБГЙЙ ЙМЙ ДЕЛМБТБФЙЧОПК ЮБУФЙ) ЗДЕ ПРЙУБО ФЙР T (ЛБЛ МАВПЕ ПРЙУБОЙЕ РТЕДУФБЧМЕОЙС). ч ТЕЪХМШФБФЕ, ЛБЛ УМЕДУФЧЙЕ, ЬФЙ РТЕДПРТЕДЕМЕООЩЕ БФТЙВХФЩ ОЕ НПЗХФ ВЩФШ ЙЪНЕОЕОЩ ДМС УФБОДБТФОП РТЕДПРТЕДЕМЕООЩИ ФЙРПЧ. пДОБЛП ПОЙ НПЗХФ ВЩФШ ЙЪНЕОЕОЩ Ч ЙИ РТПЙЪЧПДОЩИ ФЙРБИ.

уЙФХБГЙС ОЕУЛПМШЛП ХУМПЦОСЕФУС ДМС НБУУЙЧПЧ Й ЪБРЙУЕК У ДЙУЛТЙНЙОБОФБНЙ, РПУЛПМШЛХ ОЕПВИПДЙНП РТЙОЙНБФШ ЧП ЧОЙНБОЙЕ ДПРПМОЙФЕМШОХА ЙОЖПТНБГЙА РТЕДПУФБЧМСЕНХА ЪОБЮЕОЙСНЙ ЗТБОЙГ НБУУЙЧБ Й ЪОБЮЕОЙСНЙ ДЙУЛТЙНЙОБОФПЧ. (ч УМХЮБЕ ДЙУЛТЙНЙОБОФБ ЪОБЮЕОЙЕ ЛПФПТПЗП ТБЧОП ЪОБЮЕОЙА РП ХНПМЮБОЙА, ДЙУЛТЙНЙОБОФ ТБУУНБФТЙЧБЕФУС ЛБЛ ПВЩЮОЩК ЛПНРПОЕОФ ЪБРЙУЙ). ьФП ЧЩРПМОСЕФУС У РПНПЭША ЙУРПМШЪПЧБОЙС ДПРПМОЙФЕМШОЩИ БФТЙВХФПЧ 'Input Й 'Output. пУОПЧОБС ЙДЕС ЪБЛМАЮБЕФУС Ч ФПН, ЮФП БФТЙВХФЩ 'Input Й 'Output ПВТБВБФЩЧБАФ ДПРПМОЙФЕМШОХА ЙОЖПТНБГЙА (ЕУМЙ ПОБ ЕУФШ) Й ЪБФЕН ЧЩЪЩЧБАФ 'Read Й 'Write ДМС ПВТБВПФЛЙ ПУФБМШОЩИ ЪОБЮЕОЙК. йИ ПРЙУБОЙЕ ЙНЕЕФ УМЕДХАЭЙК ЧЙД:

рТЙНЕЮБФЕМШОП, ЮФП 'Input - ЬФП ЖХОЛГЙС, РПУЛПМШЛХ T НПЦЕФ ВЩФШ ОЕПРТЕДЕМЕООЩН Й ОБН НПЗХФ ВЩФШ ОЕ ЙЪЧЕУФОЩ ПЗТБОЙЮЕОЙС ЛПФПТЩЕ ХУФБОПЧМЕОЩ ДМС ЛПОЛТЕФОПЗП ФЙРБ.

фБЛЙН ПВТБЪПН, Ч УМХЮБЕ НБУУЙЧБ РТПГЕДХТБ 'Output ЧЩЧПДЙФ ЪОБЮЕОЙС ЗТБОЙГ Й, РПУМЕ ЬФПЗП, ЧЩЪЩЧБЕФ 'Write ОЕРПУТЕДУФЧЕООП ДМС УБНПЗП ЪОБЮЕОЙС.

ч УМХЮБЕ ФЙРБ ЪБРЙУЙ У ДЙУЛТЙНЙОБОФБНЙ, ЕУМЙ ЪБРЙУШ ЙНЕЕФ ДЙУЛТЙНЙОБОФЩ ЪОБЮЕОЙС ЛПФПТЩИ ТБЧОЩ ЪОБЮЕОЙСН РП ХНПМЮБОЙА, ФП 'Output РТПУФП ЧЩЪЩЧБЕФ 'Write, ЛПФПТБС ФТБЛФХЕФ ДЙУЛТЙНЙОБОФ ЛБЛ РТПУФПК ЛПНРПОЕОФ ЪБРЙУЙ. еУМЙ ЪОБЮЕОЙЕ ДЙУЛТЙНЙОБОФБ ОЕ УППФЧЕФУФЧХЕФ ФПНХ ЪОБЮЕОЙА, ЛПФПТПЕ ХЛБЪБОП ЛБЛ ЪОБЮЕОЙЕ РП ХНПМЮБОЙА, ФП УОБЮБМБ 'Output ЧЩЧПДЙФ ДЙУЛТЙНЙОБОФЩ ЪБРЙУЙ, Б ЪБФЕН ЧЩЪЩЧБЕФ 'Write ДМС ПВТБВПФЛЙ ПУФБМШОЩИ ЛПНРПОЕОФПЧ ЪБРЙУЙ. ч ЛБЮЕУФЧЕ РТЙНЕТБ, ТБУУНПФТЙН УМХЮБК ПРТЕДЕМЕООПЗП РПДФЙРБ, ЮЕК ФЙР - ЬФП РЕТЧЩК РПДФЙР, ЛПФПТЩК ОЕ ПРТЕДЕМЕО:

рТЙНЕЮБФЕМШОП, ЮФП БФТЙВХФЩ 'Output Й 'Write РТЙОБДМЕЦБФ ФЙРБН Й, ФБЛЙН ПВТБЪПН, ОЕ ЙНЕЕФ ЪОБЮЕОЙС ЙМЙ НЩ ЪБРЙУЩЧБЕН String_6'Write, ЙМЙ String'Write.

рТЙЧЕДЕООПЕ ЧЩЫЕ ПРЙУБОЙЕ ТБВПФЩ T'Input Й T'Output ПФОПУЙФУС Л БФТЙВХФБН ЛПФПТЩЕ ЪБДБОЩ РП ХНПМЮБОЙА. пОЙ НПЗХФ ВЩФШ РЕТЕПРТЕДЕМЕОЩ ДМС ЧЩРПМОЕОЙС ЮЕЗП-МЙВП ДТХЗПЗП, РТЙЮЕН ОЕ ПВСЪСФЕМШОП ДМС ЧЩЪПЧБ T'Read Й T'Write. дПРПМОЙФЕМШОП ПФНЕФЙН, ЮФП Input Й Output УХЭЕУФЧХАФ ФБЛЦЕ ДМС ПРТЕДЕМЕООПЗП РПДФЙРБ, Й ЙИ ЪОБЮЕОЙС РТПУФП ЧЩЪЩЧБАФ Read Й Write.

дМС ЧЪБЙНПДЕКУФЧЙС У ОБДЛМБУУПЧЩНЙ ФЙРБНЙ РТЕДОБЪОБЮЕОЩ БФТЙВХФЩ T' > йЪ ТБУУНПФТЕООЩИ ОБНЙ РТЙНЕТПЧ УМЕДХЕФ ПУОПЧОПК РТЙОГЙР ТБВПФЩ У РПФПЛБНЙ: ФП ЮФП УОБЮБМБ ВЩМП ЪБРЙУБОП, ФП Й ДПМЦОП ВЩФШ РТПЮЙФБОП, РТЙ ЧЩРПМОЕОЙЙ РПДИПДСЭЕК ПВТБФОПК ПРЕТБГЙЙ.

фЕРЕТШ НПЦОП РТПДПМЦЙФШ ТБУУНПФТЕОЙЕ УФТХЛФХТЩ ЛПФПТБС МЕЦЙФ Ч ПУОПЧЕ ЧУЕИ ЬФЙИ НЕИБОЙЪНПЧ. чУЕ РПФПЛЙ СЧМСАФУС РТПЙЪЧПДОЩНЙ ПФ БВУФТБЛФОПЗП ФЙРБ Streams.Root_Stream_Type ЛПФПТЩК ЙНЕЕФ ДЧЕ БВУФТБЛФОЩИ ПРЕТБГЙЙ Read Й Write ПРЙУБООЩЕ УМЕДХАЭЙН ПВТБЪПН:

пТЗБОЙЪБГЙА ТБВПФЩ ЬФЙИ НЕИБОЙЪНПЧ МХЮЫЕ ТБУУНБФТЙЧБФШ Ч ФЕТНЙОБИ РПФПЛПЧЩИ ЬМЕНЕОФПЧ, Б ОЕ ЪОБЮЕОЙК ЛБЛПЗП-МЙВП ФЙРБ. уМЕДХЕФ ПВТБФЙФШ ЧОЙНБОЙЕ ОБ ТБЪОЙГХ НЕЦДХ РПФПЛПЧЩНЙ ЬМЕНЕОФБНЙ (stream elements) Й ЬМЕНЕОФБНЙ РБНСФЙ (storage elements) (ЬМЕНЕОФЩ РБНСФЙ ВХДХФ ТБУУНПФТЕОЩ РТЙ ТБУУНПФТЕОЙЙ РХМПЧ РБНСФЙ). ьМЕНЕОФЩ РБНСФЙ (storage elements) ЪБФТБЗЙЧБАФ ЧОХФТЕООАА РБНСФШ (storage) Ч ФП ЧТЕНС ЛБЛ РПФПЛПЧЩЕ ЬМЕНЕОФЩ (stream elements) ЪБФТБЗЙЧБАФ ЧОЕЫОАА ЙОЖПТНБГЙА Й, ФБЛЙН ПВТБЪПН, РПДИПДСФ ДМС ТБУРТЕДЕМЕООЩИ УЙУФЕН.

рТЕДПРТЕДЕМЕООЩЕ БФТЙВХФЩ 'Read Й 'Write ЙУРПМШЪХАФ ПРЕТБГЙЙ Read Й Write БУУПГЙЙТПЧБООПЗП У ОЙНЙ РПФПЛБ, Й РПМШЪПЧБФЕМШ НПЦЕФ ПРЙУЩЧБФШ БФТЙВХФЩ ПДЙОБЛПЧЩН ПВТБЪПН. рТЙНЕЮБФЕМШОП, ЮФП РБТБНЕФТ Stream ДМС ЛПТОЕЧПЗП ФЙРБ ЙНЕЕФ ФЙР Root_Stream_Type, ФПЗДБ ЛБЛ БФТЙВХФ — ЬФП УУЩМПЮОЩК ФЙР ПВПЪОБЮБАЭЙК УППФЧЕФУФЧХАЭЙК ЛМБУУ. фБЛЙН ПВТБЪПН, ФБЛПК БФТЙВХФ, ПРТЕДЕМСЕНЩК РПМШЪПЧБФЕМЕН, ДПМЦЕО ВХДЕФ ЧЩРПМОСФШ РПДИПДСЭЕЕ ТБЪЩНЕОПЧБОЙЕ:

ч ЪБЛМАЮЕОЙЕ ТБУУНПФТЕОЙС РПФПЛПЧ бДЩ ЪБНЕФЙН ЮФП Ada.Stream_IO НПЦЕФ ВЩФШ ЙУРПМШЪПЧБО ДМС ПУХЭЕУФЧМЕОЙС ЙОДЕЛУЙТПЧБООПЗП ДПУФХРБ. ьФП ЧПЪНПЦОП, РПУЛПМШЛХ ЖБКМ УФТХЛФХТЙТПЧБО ЛБЛ РПУМЕДПЧБФЕМШОПУФШ РПФПЛПЧЩИ ЬМЕНЕОФПЧ. фБЛЙН ПВТБЪПН, ЙОДЕЛУЙТПЧБООЩК ДПУФХР ТБВПФБЕФ Ч ФЕТНЙОБИ РПФПЛПЧЩИ ЬМЕНЕОФПЧ РПДПВОП ФПНХ ЛБЛ ТБВПФБЕФ Direct_IO Ч ФЕТНЙОБИ ЬМЕНЕОФПЧ ФЙРБ. ьФП ЪОБЮЙФ, ЮФП ЙОДЕЛУ НПЦЕФ ВЩФШ РТПЮЙФБО Й РЕТЕХУФБОПЧМЕО. рТПГЕДХТЩ Read Й Write ЧЩРПМОСАФ ПВТБВПФЛХ ПФОПУЙФЕМШОП ФЕЛХЭЕЗП ЪОБЮЕОЙС ЙОДЕЛУБ, ФБЛЦЕ УХЭЕУФЧХЕФ БМШФЕТОБФЙЧОБС РТПГЕДХТБ Read ЛПФПТБС УФБТФХЕФ УПЗМБУОП ХЛБЪБООПЗП ЪОБЮЕОЙС ЙОДЕЛУБ. рТПГЕДХТЩ Read Й Write (ЛПФПТЩЕ ЙУРПМШЪХАФ ЖБКМПЧЩК РБТБНЕФТ) ФПЮОП УППФЧЕФУФЧХАФ ДЙУРЕФЮЕТЙЪХЕНЩН (РЕТЕОБРТБЧМСЕНЩН) ПРЕТБГЙСН БУУПГЙЙТПЧБООПЗП РПФПЛБ.


11.4 чЪБЙНПДЕКУФЧЙЕ У ЛПНБОДОПК УФТПЛПК Й ПЛТХЦЕОЙЕН

11.4.1 рБТБНЕФТЩ ЛПНБОДОПК УФТПЛЙ

чП ЧТЕНС ЧЩРПМОЕОЙС РТПЗТБННЩ УХЭЕУФЧХЕФ ЧПЪНПЦОПУФШ РПМХЮЕОЙС ДПУФХРБ Л БТЗХНЕОФБН, ЛПФПТЩЕ ХЛБЪБОЩ Ч ЛПНБОДОПК УФТПЛЕ ЪБРХУЛБ РТПЗТБННЩ ОБ ЧЩРПМОЕОЙЕ. фБЛБС ЧПЪНПЦОПУФШ ПВЕУРЕЮЙЧБЕФУС УТЕДУФЧБНЙ УФБОДБТФОПЗП РБЛЕФБ Ada.Command_Line, УРЕГЙЖЙЛБГЙС ЛПФПТПЗП ЙНЕЕФ УМЕДХАЭЙК ЧЙД:

ч ЛБЮЕУФЧЕ РТПУФПК ДЕНПОУФТБГЙЙ ЙУРПМШЪПЧБОЙС УТЕДУФЧ ЬФПЗП РТЕДПРТЕДЕМЕООПЗП УФБОДБТФПН РБЛЕФБ, ТБУУНПФТЙН УМЕДХАЭЙК РТЙНЕТ:

дБООБС РТПЗТБННБ ПФПВТБЦБЕФ ЖБЛФЙЮЕУЛПЕ ЙНС ЪБРХЭЕООПК РТПЗТБННЩ, ЛПМЙЮЕУФЧП РЕТЕДБООЩИ Ч ЛПНБОДОПК УФТПЛЕ БТЗХНЕОФПЧ, Б ЪБФЕН РПЛБЪЩЧБЕФ УФТПЛПЧЩЕ ЪОБЮЕОЙС РЕТЕДБООЩИ БТЗХНЕОФПЧ. рТПГЕДХТБ Set_Exit_Status, РБЛЕФБ Ada.Command_Line, НПЦЕФ ВЩФШ ЙУРПМШЪПЧБОБ ДМС ЧПЪЧТБФБ ЧП ЧОЕЫОА УТЕДХ ЛПДБ УФБФХУБ ЪБЧЕТЫЕОЙС ТБВПФЩ РТПЗТБННЩ (ЙОБЮЕ — ЛПДБ ПЫЙВЛЙ).

11.4.2 рЕТЕНЕООЩЕ ПЛТХЦЕОЙС РТПЗТБННЩ

дМС РПДДЕТЦЛЙ ПТЗБОЙЪБГЙЙ ЧЪБЙНПДЕКУФЧЙС У РЕТЕНЕООЩНЙ ПЛТХЦЕОЙС ПРЕТБГЙПООПК УЙУФЕНЩ, ТЕБМЙЪБГЙС ЛПНРЙМСФПТБ GNAT УПДЕТЦЙФ ДПРПМОЙФЕМШОЩК РБЛЕФ Ada.Command_Line.Environment УРЕГЙЖЙЛБГЙС ЛПФПТПЗП ЙНЕЕФ УМЕДХАЭЙК ЧЙД:

жХОЛГЙС Environment_Count ЧПЪЧТБЭБЕФ ПВЭЕЕ ЛПМЙЮЕУФЧП РЕТЕНЕООЩИ ПЛТХЦЕОЙС, Б ЖХОЛГЙС Environment_Value ЧПЪЧТБЭБЕФ УФТПЛХ Ч ЛПФПТПК УПДЕТЦЙФУС ЙНС РЕТЕНЕООПК ПЛТХЦЕОЙС Й ЕЕ ЪОБЮЕОЙЕ, ТБЪДЕМЕООЩЕ УЙНЧПМПН ТБЧЕОУФЧБ.

ОБЗОР >24.05.2020 Автоматическая рассылка в Директ Инстаграм, Автоматическое Комментирование в Инстаграм, Инстаграм Сервисы, Общение в Директе Инстаграма с компьютера без телефона, Реальный Отзыв

Видео- ОБЗОР iDirect.io — айдирект.ио — массовые рассылки в Инстаграм Директ:

Айдирект для спама сообщений в директ instagram и комменты или для общения в direct инстаграма с компа без телефона?
realreviews.idirect.io — регистрация в сервисе с бонусом +7 дней БЕСПЛАТНО!

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

Это одна из частей Реальных Отзывов о сервисах для автоматизации рутины в Инстаграме.
В прошлом видео я искал сервис, чтобы писать в директ инстаграма с компа.

Видео по итогу регулярного стрима — «Реальный Отзыв» на YouTube канале. Подписывайся и следи за новостями, чтобы не пропустить следующий эфир.

Youtube канал — Реальные Отзывы и Стартапы;
Инстаграм — Любимый Андрей;
Группа Вк — Реальные Отзывы и Стартапы

Предлагай идеи для стартапа и существующие проекты для обзора.
Задавай вопросы и давай советы в комментариях к видео! Другие видео проекта «Реальные Отзывы» на ютюб канале!

Что такое язык R и как работать с API рекламных систем Google AdWords и Яндекс.Директ с его помощью

Получайте новые статьи на эл. почту

Если вы ведете несколько небольших рекламных кампаний в одном рекламном аккаунте, то для анализа их эффективности вам достаточно посмотреть нужные данные в Google AdWords / Яндекс.Директ и Google Analytics / Яндекс.Метрике. Но чтобы даже бегло оценить эффективность пары десятков рекламных кампаний в нескольких аккаунтах таким способом, вы потратите в лучшем случае несколько часов. А на детальный анализ могут уйти дни и недели, в течение которых рекламный бюджет будет тратиться и, возможно, далеко не самым эффективным образом.

В этой статье я расскажу, как автоматизировать работу с данными из Google AdWords и Яндекс.Директ с помощью двух пакетов, расширяющих базовые возможности языка R.

Я постарался изложить материал так, чтобы его мог использовать любой пользователь — даже тот, кто пока не написал ни одной строчки кода. Для этого вполне достаточно понимания, что такое функция, хотя бы в плоскости электронных таблиц Microsoft Excel или Google Spreadsheets. Возможно, для вас этот материал станет своеобразным толчком к изучению R.

Содержание статьи:

Что такое язык R

R — это язык программирования для статистической обработки данных и работы с графикой, а также свободная программная среда вычислений с открытым исходным кодом. Именно такое определение вы можете найти на страницах Википедии.

R был создан двумя сотрудниками статистического факультета Оклендского Университета Робертом Джентелменом и Россом Айхэкой. Свое название язык получил по первой букве имен его создателей.

Как я открыл для себя R или от 1С до R за 10 лет

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

С 2007 по 2009 год основной частью моей работы была разработка технических заданий для программистов 1С на внедрение каких-либо новых отчетов. Поскольку в то время была 1С версии 7.7., говорить о каком-либо интегрированном конструкторе отчетов не приходилось. Чтобы получить данные в каком-то новом срезе, приходилось писать ТЗ и ждать его обработки от программистов.

За пару лет я довольно неплохо разобрался с Microsoft Excel и поставил одно из своих последних ТЗ программистам 1С. Эта была одна большая выгрузка сырых данных по чекам, содержащая все возможные поля. Таким образом я переехал из 1С в Excel, и табличный агрегатор от Microsoft был моим верным оруженосцем ближайшие несколько лет.

Возможно, я и сейчас бы использовал Excel, если бы он не был так прожорлив даже на выборке среднего объема. Если вам надо обработать пару десятков тысяч строк то, Excel с этим справится быстро и эффективно. Но наиболее внимательные пользователи офиса Microsoft заметили, что количество строк на рабочем листе последний раз поднималось в версии 2007 года и до сих пор даже в самых новых версиях составляет 1 048 576 строк и 16 384 столбца. И дело не в том, что Microsoft жалко добавить большее количество строк. Просто Excel слишком прожорлив на таких объемах данных, и обработка даже нескольких сотен тысяч строк займет всю вашу оперативную память. А в современном мире таблицей в миллион строк вряд ли кого-то удивишь.

Именно поэтому примерно в 2012 году я начал учить SQL. На обработку миллиона строк, даже при сложных запросах с использованием JOIN, в любой из популярных систем управления базами данных (СУБД) при нормально проиндексированных таблицах у вас уйдет не более минуты. Таким образом вопрос хранения и обработки данных я закрывал с помощью SQL, а для визуализации по прежнему использовал Excel.

В 2015 году Microsoft выпустил платформу Power BI — одно из лидирующих BI решений на данный момент. По сути, Power BI появилась как сбор надстроек над Excel, Power View (для создания интерактивных дашбордов), Power Query (для загрузки данных из различных источников) и PowerPivot (для создания модели данных и связи между таблицами). Это очень удобный инструмент для загрузки данных из множества различных источников, их очистки, построения модели данных и визуализации. Мы в Netpeak очень активно используем данную платформу для аналитики рекламных кампаний и эффективности отдела контекстной рекламы и нашего корпоративного блога.


Т.к. задачу хранения данных закрывают СУБД (мы используем MySQL и Google BigQuery), а вопрос визуализации на 80% закрывает Power BI, оставалась проблема автоматизации трансфера данных. Следовательно, нужен был инструмент, в котором можно автоматизировать трансфер и прочие рутинные операции, выполняемые вручную.

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

Глоссарий — немного терминологии

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

Функция — сгруппированный набор команд, возвращающий какое-либо значение, функции в R. Как я уже писал выше, функции в R аналогичны функциям в MS Excel.

Аргументы — практически любая функция запрашивает на вход какие-то значения, на основе которых потом производит какие-то действия и вычисления. Все эти значения вы присваиваете аргументам функции. Например, вспомним функцию ВПР в Excel, ее синтаксис выглядит следующим образом:

=ВПР(искомое значение; диапазон для поиска значения; номер столбца в диапазоне с возвращаемым значением; [точное или приблизительное совпадение — указывается как 0/ЛОЖЬ или 1/ИСТИНА])

Все значения, которые вы указываете внутри скобок после имени функции — это и есть аргументы функции. Функция ВПР имеет 3 обязательных аргумента: искомое значение, диапазон для поиска значения, номер столбца в диапазоне с возвращаемым значением; и один необязательный аргумент — точное или приблизительное совпадение.

Оператор присваивания — чтобы присвоить какому-либо объекту какое-то значение, в языке R существует оператор присваивания «

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

В статье будут приведены примеры кода обращения к API Google AdWords и Яндекс.Директ на языке R. Все примеры вы можете копировать непосредственно из текста статьи или скачивать из репозитория на GitHub, перейдя по этой ссылке.

Установка языка R

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

R является кроссплатформенным языком. Вы можете установить его как на Windows, так и на MacOS и Unix-подобные операционные системы. ​

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

Что такое пакеты в R

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

Пакет для R — это модуль, содержащий набор функций и наборов данных. Основным репозиторием хранения пакетов для R является CRAN, и на момент написания этого абзаца в CRAN было доступно 12148 пакетов. Помимо CRAN огромное количество пакетов пользователи выкладывают в открытый доступ на GitHub. Как правило, там можно найти наиболее актуальные версии пакетов от их разработчиков, и сейчас на GitHub уже 77 тысяч репозиториев на языке R.

Установка и подключения пакетов на языке R

Чтобы воспользоваться функциями или наборами данных из какого-либо пакета, его предварительно необходимо установить. Для установки пакета из CRAN достаточно воспользоваться функцией install.packages, которая имеет 1 обязательный аргумент — название пакета.

Давайте установим пакет devtools.

Пакет devtools содержит набор функций для разработки собственных функций на R, а также для установки пакетов из сторонних репозиториев, включая GitHub.

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

Чтобы установить пакет из GitHub в пакете devtools, есть функция install_github. Однако т.к. пакет devtools не входит в базовую комплектацию R, чтобы воспользоваться его функциями, необходимо предварительно подключить его к сессии R с помощью команды library.

#Подключаем пакет devtools
library(devtools)

#Устанавливаем пакет RAdwords
install_github(’jburkhardt/RAdwords’)

В данном случае функция install_github имеет также всего 1 обязательный аргумент — имя пользователя, автора репозитория на GitHub (https://github.com/jburkhardt) и название репозитория RAdwords (https://github.com/jburkhardt/RAdwords).

Получение подробной справки по работе с функциями пакета

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

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

Илон Маск рекомендует:  Как отправить сообщение сразу всем элементам управления формы

В результате будет открыта html страница следующего содержания:

Если вам необходимо получить справку по какой-то одной конкретной функции, то можно в help передать ее название. Например, для получения справки по функции doAuth подключите пакет RAdwords с помощью функции library и запустите help.


R пакеты для работы с рекламными системами

RAdwords — пакет, позволяющий работать с API Google AdWords

Установка пакета: devtools::install_github(’jburkhardt/RAdwords’)

Принцип работы с API AdWords

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

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

Атрибуты — это поля, измерения или параметры, содержащие информацию о каких-либо настройках или константах, которые не изменяют группировку запрашиваемых данных. Например, такие настройки аккаунта, как валюта (поле AccountCurrencyCode), никак не поменяют количество строк, запрашиваемых из отчета «Campaign Performance Report».

Сегменты — также являются параметрами, но при этом меняют группировку запрашиваемых данных. Например, если запросить данные из отчета «Campaign Performance Report» с полем Date, которое является атрибутом, то запрашиваемые данные по эффективности кампаний будут сгруппированы по датам.

Метрики — количественные показатели, такие как клики, показы, общий объем потраченных средств и т.д.

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

Что требуется для работы с RAdwords

Для работы с пакетом RAdwords вам понадобится доступ к API Google AdWords. О том, как его получить, довольно подробно описано в справке.

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

  1. Войдите в управляющий аккаунт и откройте страницу «Учетные данные» в Google Developers Console.
  2. В раскрывающемся меню проектов выберите «Создать проект». Затем укажите название проекта и нажмите кнопку «Создать».
  3. Выберите «Создать учетные данные», а затем — «Идентификатор клиента OAuth».
  4. Если система предложит указать название продукта, нажмите «Настроить окно запроса доступа», укажите запрашиваемую информацию и нажмите «Сохранить», чтобы вернуться к экрану «Учетные данные».
  5. В разделе «Тип приложения» выберите «Другие типы». Укажите название в появившемся поле.
  6. Нажмите кнопку «Создать». Появятся идентификатор и секретный ключ клиента OAuth2. Скопируйте и сохраните их. На следующем шаге их нужно будет добавить в файл конфигурации.

Основные функции пакета RAdwords

На самом деле в RAdwords не так много функций. Вот список основных из них:

  • doAuth — аутентификация в API. Для ее прохождения вам потребуется токен разработчика AdWords, идентификатор и секретный ключ клиента, созданного в Google Console на предыдущем шаге.
  • reports — возвращает вектор доступных отчетов в API в ответ на запрос.
  • metrics — возвращает вектор полей, доступных в отчете, в ответ на запрос.
  • statement — подготовка запроса к API AdWords.
  • getData — отправка запроса и получение данных из API.

Пример кода для получения данных из Google AdWords с помощью RAdwords

Функция statement формирует тело запроса. В аргументе select вы в виде вектора передаете название всех запрашиваемых полей. В аргумент report название отчета, из которого запрашиваете данные. В аргументы start и end передаете отчетный период.

Важно: дату необходимо перевести в формат ГГГГММДД. По умолчанию формат даты в R — ГГГГ-ММ-ДД. Вы можете либо в виде строки передать нужные даты, либо преобразовать любую дату с помощью функции format.Date, как в моем примере выше.

Функция getData запрашивает в агрумент clientCustomerId номер рекламного аккаунта AdWords в формате 000-000-0000.

В начале скрипта мы создали переменную adwords_auth и передали в нее с помощью функции doAuth учетные данные, необходимые для доступа к API Google AdWords. В аргумент google_auth функции getData необходимо передать сохраненные ранее учетные данные.

В аргумент statement следует передавать тело запроса, созданное с помощью функции statement.

После выполнения приведенного выше кода в рабочем окружении будет создан объект AdwData, который будет содержать таблицу (Data frame) со всей запрошенной из API информацией.

Еще несколько примеров работы с RAdwords

ryandexdirect — пакет позволяющий работать с API Яндекс.Директ и Яндекс.Метрикой

Установка пакета на Windows: devtools::install_github(«selesnow/ryandexdirect») Установка пакета на MacOS и Linux: devtools::install_github(«selesnow/ryandexdirect«, subdir = «utf8»)

Принцип работы с API Яндекс.Директ

5 версия API Яндекс.Директ, в отличие от предыдущей, довольно сильно напоминает API Google AdWords при работе с получением статистики.

Для получения статистики в 5 версии API используется сервис Reports. С помощью данного сервиса вы так же, как и из API AdWords, можете запрашивать любые поля, доступные в одном из 7 отчетов.


Отчеты в сервисе Reports.

Тип отчета Описание
CAMPAIGN_PERFORMANCE_REPORT Статистика по кампаниям
ADGROUP_PERFORMANCE_REPORT Статистика по группам объявлений
AD_PERFORMANCE_REPORT Статистика по объявлениям
CRITERIA_PERFORMANCE_REPORT Статистика по условиям показа
CUSTOM_REPORT Статистика с произвольными группировками
SEARCH_QUERY_PERFORMANCE_REPORT Статистика по поисковым запросам

Наиболее общий тип отчета — CUSTOM_REPORT. Он не добавляет никаких дополнительных группировок.

Все поля отчетов разделены по типу:

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

Например, поле CampaignId для типа отчета CUSTOM_REPORT является сегментом — если его добавить в отчет, данные будут сгруппированы по кампаниям. А для типа отчета ADGROUP_PERFORMANCE_REPORT поле CampaignId является атрибутом — данные уже сгруппированы по AdGroupId, а идентификатор кампании является для каждой группы фиксированным значением.

Актуальный список всех доступных полей с их типами для каждого отчета можно найти в официальной справке Яндекс.Директ.

Некоторые поля нельзя одновременно запрашивать в рамках одного запроса:

  • Поля Date, Week, Month, Quarter, Year являются взаимоисключающими: только одно из них может присутствовать в отчете.
  • Поля CriterionType, CriteriaType, AudienceTargetId, DynamicTextAdTargetId, Keyword, SmartBannerFilterId являются взаимоисключающими: только одно из них можно использовать для фильтрации данных.
  • Поле ClickType несовместимо с полями Impressions, Ctr, AvgImpressionPosition.
  • Поле ImpressionShare несовместимо с полями AdFormat, AdId, Age, CarrierType, Gender, MobilePlatform, RlAdjustmentId, TargetingLocationId, TargetingLocationName.
  • Поля Criterion, CriterionId, CriterionType несовместимы с полями Criteria, CriteriaId, CriteriaType.

Основные функции пакета ryandexdirect

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

  • yadirGetToken — получение токена доступа к API. Токен является обязательным для работы со всеми остальными функциями пакета, таким образом вы авторизуетесь для работы с API Директа.
  • yadirGetReport — получение статистики из сервиса Report.
  • yadirGetDictionary — получение справочной информации, например справочник регионов или курсов валют.
  • yadirGetLogsData — получение сырых данных из Logs API Яндекс.Метрики.
  • yadirGetMetrikaGAData — получение данных из API Яндекс.Метрики, совместимых с Google Analytics Core Reporting API (v3).

Помимо работы со статистикой, с помощью ryandexdirect можно останавливать и возобновлять показы на уровне объявлений, ключевых слов и рекламных кампаний.

Для этого доступно 6 функций:

  • yadirStartAds — возобновить показы по объявлениям.
  • yadirStopAds — остановить показы по объявлениям.
  • yadirStartCampaigns — возобновить показы по рекламным кампаниям.
  • yadirStopCampaigns — остановить показы по рекламным кампаниям.
  • yadirStartKeyWords — возобновить показы по ключевым словам.
  • yadirStopKeyWords — остановить показы по ключевым словам.

Пример кода для получения статистики из Яндекс.Директ с помощью ryandexdirect.

Пример #1: Загрузка статистики по кампаниям в разрезе дат.

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

Я думаю, приведенный код вполне понятен, но, на всякий случай, дам небольшие пояснения:

  • Изначально мы подключаем пакет с помощью команды library.
  • Далее получаем токен разработчика с помощью yadirGetToken и сохраняем его в объект tok. На самом деле не требуется каждый раз при обращении к API получать новый токен. Срок жизни одного токена — более 30 дней с момента последнего использования, поэтому получив его один раз, вы можете его использовать в скриптах в виде строки. Например, передать в объект tok значение полученного ранее токена вот так: tok «CAMPAIGN_PERFORMANCE_REPORT» .
  • В аргумент DateRangeType необходимо передать, как вы будете определять период. В нашем случае мы берем данные за последние 30 дней, но у вас есть довольно широкие возможности определения временного интервала:
    • TODAY — текущий день.
    • YESTERDAY — вчера.
    • LAST_3_DAYS, LAST_5_DAYS, LAST_7_DAYS, LAST_14_DAYS, LAST_30_DAYS, LAST_90_DAYS, LAST_365_DAYS — указанное количество предыдущих дней, не включая текущий день.
    • THIS_WEEK_MON_TODAY — текущая неделя, начиная с понедельника, включая текущий день.
    • THIS_WEEK_SUN_TODAY — текущая неделя, начиная с воскресенья, включая текущий день.
    • LAST_WEEK — прошлая неделя с понедельника по воскресенье.
    • LAST_BUSINESS_WEEK — прошлая рабочая неделя с понедельника по пятницу.
    • LAST_WEEK_SUN_SAT — прошлая неделя с воскресенья по субботу.
    • THIS_MONTH — текущий календарный месяц.
    • LAST_MONTH — полный предыдущий календарный месяц.
    • ALL_TIME — вся доступная статистика, включая текущий день.
    • CUSTOM_DATE — произвольный период. При выборе этого значения необходимо указать даты начала и окончания периода в параметрах DateFrom и DateTo.
    • AUTO — период, за который статистика могла измениться. Период выбирается автоматически в зависимости от того, произошла ли в предыдущий день корректировка статистики. Подробнее см. в разделе «Как получить актуальную статистику».
  • В аргумент FieldNames необходимо передать вектор, содержащий названия запрашиваемых из отчета полей. В нашем случае мы перечисляем список запрашиваемых полей: Date, CampaignName, CampaignId, Impressions, Clicks, Cost. Список всех доступных полей можно найти в официальной справке.

После выполнения приведенного кода в рабочем окружении будет создан объект data, который будет представлять таблицу (Data frame), содержащую запрошенные из API данные.

Пример #2: Загрузка статистики из рекламного аккаунта в разрезе стран и регионов.

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

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


Выполним приведенный ниже код.

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

Справочник, который возвращает API, содержит всего 4 поля:

Как я уже писал выше, в ответ на запрос API вернет статистику по максимально точному месту нахождения пользователя, согласно представленной в GeoRegionType иерархии. Это значит, что если пользователь, кликнувший по объявлению, находится в селе (Village — нижний уровень иерархии географического справочника), которое занесено в географический справочник, то данные по количеству кликов и потраченным средствам будут отнесены к ID именно этого села.

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

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

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

В результате мы преобразуем полученный ранее справочник к следующему виду:

  • AreaID — ID административного округа, в который входит текущий элемент справочника.
  • CountryID — ID страны округа, в который входит текущий элемент справочника.
  • GeoRegionId — ID текущего элемента справочника.
  • ParentId — ID родительского элемента.
  • GeoRegionType — тип региона текущего элемента справочника.
  • CountryName — название страны, в которую входит текущий элемент справочника.
  • GeoRegionName — название региона текущего элемента справочника.
  • AreaName — название административного округа, в который входит текущий элемент справочника.

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

Используя аргумент all.x = T, мы говорим о том, что необходимо к таблице X (данные статистики) присоединить таблицу Y (географический справочник) с помощью левого внешнего соединения (LEFT JOIN). То есть мы берем все строки из таблицы статистики и присоединяем к ним нужные строки из географического справочника по ключу GeoRegionId.

Таким образом мы получили отчет по первичным показателям эффективности рекламных кампаний в разрезе стран и регионов.

Еще несколько примеров работы с ryandexdirect

Выводы

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

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

Успехов вам в построении автоматизации и изучении языка R. Если остались вопросы или нужен совет, буду рад ответить вам в комментариях.

> [[ analysis.dateUpdatedInfo ]]

Последние события

\u00ab\u041f\u0440\u0438 \u0440\u0430\u0441\u0447\u0451\u0442\u0435 \u0418\u041a\u0421 \u043c\u044b \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u0443 \u043d\u0430\u0441 \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043a \u043e \u0441\u0430\u0439\u0442\u0435, \u0442\u0430\u043a \u0438 \u043e \u0441\u0442\u043e\u044f\u0449\u0435\u043c \u0437\u0430 \u043d\u0438\u043c \u0431\u0438\u0437\u043d\u0435\u0441\u0435. \u042d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b \u043a\u0430\u043a \u0438\u0437 \u041f\u043e\u0438\u0441\u043a\u0430, \u0442\u0430\u043a \u0438 \u0438\u0437 \u043b\u044e\u0431\u044b\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u042f\u043d\u0434\u0435\u043a\u0441\u0430: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u041c\u0435\u0442\u0440\u0438\u043a\u0438, \u041a\u0430\u0440\u0442, \u0414\u0437\u0435\u043d\u0430 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435\u00bb \u2014 \u042f\u043d\u0434\u0435\u043a\u0441.\u0412\u0435\u0431\u043c\u0430\u0441\u0442\u0435\u0440 \n

\u0420\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044e \u043d\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u041a\u0430\u0440\u0442\u0430\u0445 \n

\u041f\u043e\u0441\u043b\u0435 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438: \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u0430\u0434\u0440\u0435\u0441, \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u044b, \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438, \u0441\u0441\u044b\u043b\u043a\u0438, \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u044b. \u041f\u043e\u0441\u043b\u0435 \u043e\u0434\u043e\u0431\u0440\u0435\u043d\u0438\u044f \u0437\u0430\u044f\u0432\u043a\u0438 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0438\u043f\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u2014 \u043c\u0435\u043d\u044e, \u0433\u0430\u043b\u0435\u0440\u0435\u044e, \u043f\u0440\u0430\u0439\u0441-\u043b\u0438\u0441\u0442 \u0438 \u043f\u0440\u043e\u0447\u0435\u0435. \n

\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u041a\u0430\u0440\u0442\u0430\u0445 \n

\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0442\u043e\u0432\u0430\u0440\u044b \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430 \u043a \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u042f\u043d\u0434\u0435\u043a\u0441.\u041c\u0430\u0440\u043a\u0435\u0442 , \u0432\u0435\u0441\u0442\u0438 \u0431\u043b\u043e\u0433 \u0432 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0437\u0435\u043d\u0435 . \n

\u0420\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044e \u043d\u0430 Google \u041a\u0430\u0440\u0442\u0430\u0445 \n

\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0441\u0430\u0439\u0442\u0430\u043c \u042f\u043d\u0434\u0435\u043a\u0441 \u0440\u0430\u0437\u0434\u0430\u0435\u0442 \u0437\u043d\u0430\u043a\u0438 \u043e\u0442\u043b\u0438\u0447\u0438\u044f , \u043e\u043d\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0432\u044b\u0434\u0430\u0447\u0435 \u043e\u043a\u043e\u043b\u043e \u0441\u043d\u0438\u043f\u043f\u0435\u0442\u0430. \u0421\u043d\u0438\u043f\u043f\u0435\u0442\u044b \u0441\u043e \u0437\u043d\u0430\u043a\u0430\u043c\u0438 \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f, \u0441\u043e\u043e\u0431\u0449\u0430\u044e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u0430\u0439\u0442\u0435 \u0438 \u0441\u043b\u0443\u0436\u0430\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u043e\u043c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0442 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u0438\u043a\u0430. \n

\u0421\u043d\u0438\u043f\u043f\u0435\u0442 \u0441\u043e \u0437\u043d\u0430\u043a\u043e\u043c \u00ab\u0412\u044b\u0431\u043e\u0440 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\u00bb \n

\u0417\u043d\u0430\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0441\u0430\u0439\u0442\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e. \u0414\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439 \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0438\u0434\u044b \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044f\u043c\u0438: \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0442, \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0438\u043b\u0435\u0440, \u0441\u0435\u0440\u0432\u0438\u0441 \u042f\u043d\u0434\u0435\u043a\u0441\u0430, \u0432\u044b\u0431\u043e\u0440 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435. \u0423 \u0441\u0430\u0439\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u043a\u043e\u0432. \n

\u0417\u043d\u0430\u043a\u0438 \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u0441\u0430\u0439\u0442\u0430 \n

\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u043a\u043e\u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u0430\u0439\u0442\u0430 \u0438 \u043e\u0446\u0435\u043d\u0438\u0442\u0435 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0438, \u043d\u0430\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \n

\u0421\u0430\u0439\u0442, \u043d\u0430\u0440\u0443\u0448\u0430\u044e\u0449\u0438\u0439 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445, \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0441\u0430\u043d\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u043f\u043e\u043f\u0430\u0434\u0435\u0442 \u043f\u043e\u0434 \u0444\u0438\u043b\u044c\u0442\u0440 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u0438\u043a\u043e\u0432 . \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043f\u043e\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0432 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u043e\u0439 \u0432\u044b\u0434\u0430\u0447\u0435, \u0432\u044b\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u0440\u0435\u0441\u0443\u0440\u0441\u0430. \u0421\u0430\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0430\u0439\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0438\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0437\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0440\u0435\u0441\u0443\u0440\u0441 \u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0447\u0435\u0441\u0442\u043d\u043e, \u043d\u043e \u0435\u0449\u0435 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0441\u0430\u043d\u043a\u0446\u0438\u0438, \u044d\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u0438\u043a \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0434\u043e \u043d\u0435\u0433\u043e \u043d\u0435 \u0434\u043e\u0431\u0435\u0440\u0435\u0442\u0441\u044f. \n

\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u0445 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043d\u0430 \u043f\u0435\u0440\u0435\u0441\u043f\u0430\u043c \u0432 \u0442\u0435\u043a\u0441\u0442\u0430\u0445, \u043d\u0430\u0432\u044f\u0437\u0447\u0438\u0432\u044b\u0435 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u043e\u043a\u043d\u0430 \u0438\u043b\u0438 \u043d\u0435\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438. \n

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL