| // |
| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| // |
| |
| = Удаленная разработка на C/C++ - Практическое руководство по IDE NetBeans |
| :jbake-type: tutorial |
| :jbake-tags: tutorials |
| :jbake-status: published |
| :icons: font |
| :syntax: true |
| :source-highlighter: pygments |
| :toc: left |
| :toc-title: |
| :description: Удаленная разработка на C/C++ - Практическое руководство по IDE NetBeans - Apache NetBeans |
| :keywords: Apache NetBeans, Tutorials, Удаленная разработка на C/C++ - Практическое руководство по IDE NetBeans |
| |
| Март 2014 г. [Номер версии: V8.0-1] |
| |
| В этом практическом руководстве показано, как использовать функции IDE NetBeans для удаленной разработки проектов C/C++/Fortran. |
| |
| |
| |
| == Требования |
| |
| *Для работы с этим учебным курсом требуется программное обеспечение, указанное ниже.* |
| |
| |=== |
| |Программное обеспечение |Требуемая версия |
| |
| |IDE NetBeans (включая поддержку C/C++) |link:https://netbeans.org/downloads/index.html[+версия 7.3, 7.4 или 8.0 с подключаемым модулем NetBeans C/C+++] |
| |
| |Комплект для разработчика на языке Java (JDK) |link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+Версия 7 или 8+] |
| |=== |
| |
| |
| Дополнительные сведения о загрузке и установке необходимого программного обеспечения см. в разделах link:../../../community/releases/80/install.html[+Инструкции по установке IDE NetBeans+] и link:../../../community/releases/80/cpp-setup-instructions.html[+Настройка IDE NetBeans для C/C++/Fortran+] |
| . |
| |
| |
| == Введение |
| |
| В этом учебном руководстве показано использование функции удаленной разработки проектов C/C++. |
| |
| А вы пробовали создавать приложения Solaris или Linux на ноутбуке под управлением Windows 7 или Mac OS X? Нужно тестировать приложение в других операционных системах прямо в среде IDE? Нужно компилировать крупные приложения на быстром многоядерном сервере, а не на обычной рабочей станции? Специально для таких случаев в IDE NetBeans была реализована возможность удаленной разработки. |
| |
| |
| == Ключевые понятия удаленной разработки |
| |
| При удаленной разработке вы запускаете IDE NetBeans на клиенте и создаете проекты, редактируете файлы и используете функции помощи при работе с кодом точно так же, как при работе с локальными проектами. При этом в ходе сборки, выполнения или отладки проекта процесс выполняется на удаленном сервере Solaris или Linux, а входные и выходные данные передаются в клиентскую систему. В идеальном случае после настройки узла удаленной сборки разработчик не замечает разницы между локальным и удаленным режимами разработки. |
| |
| IDE поддерживает различные режимы удаленной разработки, описанные в разделе link:./remote-modes.html[+Режимы удаленной разработки на C/C+++]. Вы можете выбрать наиболее удобный режим разработки на удаленном узле. |
| |
| |
| === Требования для удаленной разработки |
| |
| Для использования удаленного узла при запуске различных средств необходимо выполнение следующих условий. |
| |
| * Локальная клиентская система, в которой установлена среда IDE, должна работать под управлением Windows, Mac OS, Oracle Solaris 10, Oracle Solaris 11 или Linux. |
| * Удаленный узел должен работать под управлением Oracle Solaris 10, Oracle Solaris 11 или Linux. |
| * Локальная клиентская система и удаленная система должны иметь доступ к файлам проекта через ресурсы с совместным доступом или при помощи протокола SSH. |
| * Клиент должен обладать возможностью подключения к удаленной системе через протокол SSH, даже если файлы проекта находятся в папках совместного доступа. |
| * В удаленной системе должен быть реализован доступ к поддерживаемому набору средств. |
| * В удаленной системе должны присутствовать системные библиотеки, необходимые для активации помощника при работе с кодом в проекте. |
| |
| |
| === Совместное использование исходного кода |
| |
| Клиентская система и удаленный сервер должны иметь сведения о файлах исходного кода. Файлы исходного кода могут находиться в каталоге с совместным доступом или могут быть безопасным образом скопированы средой IDE из локальной системы в удаленную. В разделе <<system,Настройка системы>> приведены дополнительные сведения о способах настройки общих папок в различных системах. |
| |
| |
| === Взаимодействие |
| |
| Обмен данными между клиентом и сервером осуществляется по протоколу Secure Shell (SSH). SSH представляет собой распространенный протокол для безопасного обмена данными между двумя сетевыми устройствами. На вашем сервере должен быть установлен сервер SSH, и должно быть разрешено соединение по протоколу SSH между клиентом и сервером. |
| |
| |
| === Наборы средств |
| |
| Как правило, IDE самостоятельно обнаруживает поддерживаемый набор средств на удаленном узле: GNU Compiler Collection, Sun Studio или Oracle Solaris Studio. Исполняемые файлы средств должны находиться в пути учетной записи пользователя, используемой для подключения к удаленному узлу, для быстрого доступа среды IDE к этим средствам. В особенности это касается средств, установленных в местоположениях, отличных от местоположений по умолчанию. |
| |
| |
| === Вспомогательные функции |
| |
| Для корректной поддержки функций редактора (например, автозавершения кода, семантического выделения, окна классов и др.) следует работать с проектом в корректно настроенной среде, т.е. среда должна содержать системные файлы include, определения макросов, платформу и пр. Все эти данные поступают с удаленного сервера и хранятся на локальном клиенте, поэтому при локальном изменении проекта помощник при работе с кодом будет активен, даже если проект настроен для работы с удаленным узлом сборки. |
| |
| |
| == Настройка системы |
| |
| Удаленный сервер Linux или Solaris должен разрешить взаимодействие через протокол SSH с клиентского компьютера, на котором запущена среда IDE. При необходимости использования совместного доступа к файлам вместо копирования файлов средой IDE на удаленный сервер необходимо настроить совместный доступ к файлам для обеих систем. |
| |
| |
| === Протокол SSH |
| |
| Сервер SSH обычно содержится в операционных системах Linux и Solaris и по умолчанию запускается в большинстве случаев. Если сервер не запущен, то для получения сведений об установке и управлении SSH см. статью link:http://en.wikipedia.org/wiki/Secure_Shell[+http://en.wikipedia.org/wiki/Secure_Shell+] |
| |
| Среда IDE предоставляет собственный клиент ssh, так что нет необходимости устанавливать клиент ssh на локальном компьютере. |
| |
| Необходимо активировать соединение SSH между клиентской и серверной системами, что, как правило, означает наличие на сервере открытого порта 22. Если порт 22 отключен, то вам может понадобиться доступ с правами пользователя root (администратора) или помощь администратора системы. |
| |
| Между системами должна быть разрешена передача данных по протоколу SSH, даже если для передачи файлов проекта на удаленный сервер не используется функция 'Автоматическое копирование' или SFTP. |
| |
| |
| === Совместное использование исходного кода |
| |
| Если вы еще не настроили общий доступ к файлам между системой Windows и удаленным узлом Unix для других целей, в небольших и средних проектах намного удобнее использовать функцию 'Автоматическое копирование' или SFTP вместо предоставления общего доступа к файлам. Если вы работаете над большим проектом и в сборке участвуют тысячи файлов, целесообразнее предоставлять общий доступ к файлам, так как копирование займет много времени. |
| |
| Для схемы "Windows-UNIX®" существует два способа совместного доступа к ресурсам: |
| |
| * Сервер Samba в системе UNIX |
| * Пакет служб Windows для UNIX (SFU), установленный в системе Windows |
| |
| |
| ==== Упорядочивание исходных файлов с помощью Samba или SMB |
| |
| Сервер Samba (версия SMB с открытым кодом) позволяет пользователю Windows подключать общие папки NFS как сетевые диски Windows. Пакет Samba или его эквиваленты SMB и CIFS в большинстве случаев входят в состав дистрибутивов операционных систем Linux и Solaris. Если пакет Samba не включен в дистрибутив вашей системы, его можно загрузить на веб-сайте link:http://www.samba.org/[+www.samba.org+] |
| |
| При наличии привилегированного доступа к серверу настройку сервера Samba можно выполнить самостоятельно. Ссылки на инструкции приведены ниже. В противном случае для этого необходимо связаться с администратором системы. |
| |
| * Краткая информация об Oracle Solaris 11: link:https://blogs.oracle.com/paulie/entry/cifs_sharing_on_solaris_11[+https://blogs.oracle.com/paulie/entry/cifs_sharing_on_solaris_11+]. Подробная информация: link:http://docs.oracle.com/cd/E26502_01/html/E29004/smboverview.html[+Управление общим доступом к файлам SMB и взаимосовместимость с Windows в Oracle Solaris 11.1+]. |
| * Oracle Solaris 10: link:http://blogs.oracle.com/timthomas/entry/enabling_and_configuring_samba_as[+http://blogs.oracle.com/timthomas/entry/enabling_and_configuring_samba_as+] |
| * Linux: link:http://www.linux.com/articles/58593[+http://www.linux.com/articles/58593+] |
| |
| После запуска сервера Samba папки сервера UNIX можно отобразить так же, как и папки Windows. |
| |
| |
| ==== Службы Windows для UNIX (SFU) |
| |
| Другой возможностью являются "Службы Windows для UNIX" - набор средств, предоставляемый компанией Майкрософт для доступа к файловым системам NFS из Windows. |
| Эти службы можно загрузить из link:http://www.microsoft.com/downloads/details.aspx?FamilyID=896c9688-601b-44f1-81a4-02878ff11778&displaylang=en[+Центра загрузки Майкрософт+], а также просмотреть документацию на link:http://technet.microsoft.com/en-us/library/bb496506.aspx[+странице служб Windows для Unix+]. |
| |
| Пакет SFU недоступен пользователям Windows Vista или Windows 7. Версии Windows 7 Корпоративная и Максимальная содержат компоненты служб для Unix с именами "Подсистема для приложений на основе UNIX" (SUA) и "Клиент для NFS v 3". Дополнительные сведения приведены в статье link:http://en.wikipedia.org/wiki/Microsoft_Windows_Services_for_UNIX#Subsystem_for_UNIX-based_Applications_.28SUA.29[+http://en.wikipedia.org/wiki/Microsoft_Windows_Services_for_UNIX+] |
| |
| |
| ==== Настройка Mac OS X |
| |
| Система Mac OS X поддерживает подключение к серверам Samba. Кроме того, система Mac OS X может монтировать общие папки NFS с сервера. |
| |
| Можно использовать команду "Finder" > "Переход" > "Подключиться к серверу" и ввести адрес сервера. |
| |
| Для подключения к серверам SMB/CIFS (Windows) и папкам совместного доступа введите адрес сервера в одной из следующих форм: |
| |
| [source,bash] |
| ---- |
| `smb://_DNSname/sharename_ |
| smb://_IPaddress/sharename_` |
| ---- |
| |
| Будет выведен запрос на ввод имени пользователя и пароля для папки совместного доступа. Дополнительные сведения приведены в разделе link:http://support.apple.com/kb/ht1568[+Подключение к совместному использованию файлов Windows (SMB)+] в базе знаний Apple (на английском языке). |
| |
| Для подключения к серверу NFS введите имя сервера и путь к папке совместного доступа NFS в одной из следующих форм: |
| |
| [source,bash] |
| ---- |
| `nfs://_servername/path/to/share/_ |
| nfs://_IPaddress/path/to/share_` |
| ---- |
| |
| Дополнительные сведения приведены в разделе link:http://support.apple.com/kb/TA22243[+Использование средства поиска для монтирования экспорта NFS+] в базе данных Apple. |
| |
| Запрос имени пользователя и пароля не выводится, однако выполняется проверка подлинности уникального идентификатора Mac. Уникальный идентификатор (UID) является уникальным целым числом, присваиваемым имени пользователя в ОС типа Unix, например Mac OS X, Solaris и Linux. Для использования NFS уникальный идентификатор Mac должен совпадать с уникальным идентификатором учетной записи на сервере. |
| |
| |
| ==== Схема "UNIX-UNIX" |
| |
| Для предоставления общего доступа к файлам между системами Solaris или Linux не требуется специальных настроек. В одной из систем должна находиться общая папка. Возможно также использование домашнего каталога, если он смонтирован на сетевом файловом сервере и доступен из обеих систем. |
| |
| |
| === Отображение пути |
| |
| При использовании модели с ресурсами совместного доступа может возникнуть необходимость сопоставления расположения исходного кода на локальном узле с путем, используемым на удаленном узле. |
| |
| Например, рассмотрим следующую схему: |
| |
| * Сервер Solaris ``solserver`` с папкой совместного доступа ``/export/pub`` |
| * Рабочая станция под управлением Windows XP с установленными службами SFU и местоположением ``\\solserver\export\pub`` , смонтированным в качестве диска ``P:`` |
| * Файлы исходного кода проекта расположены на сервере ``solserver`` в папке ``/export/pub/myproject`` |
| |
| В этом случае с точки зрения сервера файлы исходного кода расположены в каталоге ``/export/pub/myproject`` . В то же время с точки зрения клиента файлы исходного кода расположены в каталоге ``P:\myproject`` . Необходимо, чтобы среда IDE могла распознавать подключенные пути: |
| ``/export/pub -> P:\`` |
| |
| Параметры подключенных путей можно изменить в свойствах узла сборки. |
| |
| При настройке совместно используемых ресурсов для исходных файлов перед настройкой удаленного узла в IDE NetBeans среда IDE в большинстве случаев автоматически обнаруживает необходимые подключенные пути. |
| |
| |
| == Настройка среды IDE |
| |
| В следующем примере клиентский узел является рабочей станцией под управлением Windows Vista. Удаленный узел с именем ``edgard`` - это сервер под управлением операционной системы Oracle Solaris. |
| |
| 1. Откройте окно "Службы", выбрав меню "Окно" > "Службы". |
| 2. Щелкните правой кнопкой мыши узел 'Узлы сборки C/C++' и выберите 'Добавить новый узел'. |
| image::images/remotedev-add-host.png[]В диалоговом окне 'Настройка нового удаленного узла' среда IDE обнаруживает узлы локальной сети. Имена узлов добавляются в таблицу в диалоговом окне. Зеленый индикатор указывает на то, что на этих узлах запущен сервер SSH. |
| |
| [start=3] |
| . Дважды щелкните имя требуемого сервера или введите его имя непосредственно в поле "Имя сервера". Нажмите кнопку "Далее". |
| image::images/remotedev-setup-host.png[] |
| |
| [start=4] |
| . Введите в окне "Настройка узла" имя пользователя и пароль, используемые для входа на удаленный узел, и выберите метод проверки подлинности. При работе с данным учебным курсом выберите "Пароль" и нажмите кнопку "Далее".image::images/remotedev-setup-host-auth.png[] |
| |
| Для использования ключей ssh сначала необходимо настроить их вне среды IDE. Затем можно указать местоположение ключей ssh в среде IDE, и IDE сможет использовать эти ключи для установки подключения к удаленному узлу сборки по протоколу ssh. |
| |
| |
| [start=5] |
| . После установки подключения к серверу введите пароль в диалоговом окне "Проверка подлинности". |
| |
| [start=6] |
| . Дополнительно можно щелкнуть "Запомнить пароль" для выполнения в среде IDE шифрования и сохранения пароля на локальном диске, чтобы ввод пароля не требовался при каждом подключении среды IDE к удаленному узлу. |
| |
| Среда IDE настраивает удаленный узел и выполняет поиск наборов средств удаленного узла. |
| |
| |
| [start=7] |
| . После успешной настройки узла на странице общих сведений выводится информация об удаленном узле: платформа, имя узла, имя пользователя для входа, а также найденные наборы средств. |
| image::images/remotedev-setup-host-summary.png[] |
| |
| [start=8] |
| . В нижней части страницы общих сведений отображаются еще два параметра. Если найдено несколько наборов средств, выберите один из них для определения его как набора средств по умолчанию. |
| |
| [start=9] |
| . Настройка параметров доступа к файлам проекта: |
| * Если для клиента и удаленного узла сборки не настроен общий доступ к файлам проекта, выберите параметр 'Автоматическое копирование'. Если выбран параметр 'Автоматическое копирование', файлы проекта будут копироваться в домашний каталог на сервере с помощью команды sftp. Этот режим называется простой удаленной разработкой. |
| * Если для клиента и сервера настроена общая папка, выберите параметр 'Совместное использование файлов на уровне системы'. Этот режим называется совместной или комбинированной удаленной разработкой. |
| * Выберите SFTP (только в NetBeans 7.4 и 8.0) для использования безопасного протокола передачи файлов при копировании файлов проекта на удаленный узел. Аналогично функции 'Автоматическое копирование'. |
| |
| [start=10] |
| . Для выхода из мастера нажмите кнопку "Готово". |
| |
| [start=11] |
| . В окне 'Службы' новый удаленный узел отображается в структуре узла 'Узлы сборки C/C++'. Разверните новый узел: список "Наборы средств" должен содержать один или несколько наборов средств. |
| image::images/remotedev-remote-toolchain.png[] |
| |
| |
| === Если в списке нет наборов средств |
| |
| Если в списке под удаленным узлом отсутствуют наборы средств, выполните следующие действия. |
| |
| * На удаленном узле добавьте в пользовательский путь узла каталог bin набора средств. Если наборы средств на удаленном узле недоступны, следует установить набор компиляторов GNU, либо программное обеспечение Sun Studio или Oracle Solaris Studio. |
| * Если путь к исполняемым файлам средств находится в пользовательском пути к удаленному узлу, можно попытаться повторно настроить набор средств в локальной системе. Щелкните правой кнопкой мыши узел в окне "Службы" и выберите команду "Восстановить наборы средств по умолчанию" для выполнения в среде IDE повторной попытки поиска наборов средств на удаленном узле. |
| * В качестве альтернативы щелкните правой кнопкой мыши узел в окне 'Службы' и выберите 'Добавить набор инструментов' для указания или перехода к путь к набору инструментов на удаленном узле. |
| |
| Когда набор средств появится в списке, создание удаленного узла сборки будет завершено. |
| |
| Используя информацию следующего раздела, вы сможете попрактиковаться в простой удаленной разработке. |
| |
| |
| == Сборка локального проекта на удаленном узле |
| |
| 1. Создайте новый тестовый проект (Файл > Создать проект). |
| 2. Разверните 'Образцы > C/C++' и выберите 'Welcome'. Нажмите 'Далее'. |
| |
| В этом примере не используются общие папки, поэтому можно хранить проект в местоположении по умолчанию в папке NetBeansProjects в каталоге пользователя Windows без предоставления общего доступа. |
| |
| Если вы хотите использовать общие исходные файлы, убедитесь, что в поле 'Местоположение проекта' указан путь к папке, доступной для удаленного сервера. |
| |
| |
| [start=3] |
| . В списке 'Узел сборки' выберите новый удаленный узел. Список наборов средств будет обновлен для отображения доступных средств удаленного узла. |
| image::images/remotedev-new-project.png[] |
| |
| [start=4] |
| . Для создания проекта нажмите кнопку "Готово". |
| |
| Проект Welcome_1 открывается в окне 'Проекты'. |
| |
| |
| [start=5] |
| . Наведите указатель мыши на имя проекта в окне 'Проекты'. Отобразится всплывающая подсказка с информацией о расположении проекта и удаленном узле сборки, выбранном для этого проекта. |
| |
| [start=6] |
| . Нажмите кнопку 'Собрать' на панели инструментов или щелкните узел проекта Welcome_1 правой кнопкой мыши и выберите 'Собрать'. Тестовый проект будет собран удаленно на выбранном узле сборки. |
| |
| [start=7] |
| . Откройте исходный файл ``welcome.cc`` . |
| |
| На иллюстрации показано, как работают функции 'Помощь при работе с кодом' при нажатии сочетания клавиш Ctrl-Space и установленном фокусе на символе ``argc`` . |
| |
| В окне 'Результаты' отображается имя узла, на котором было собрано приложение, а также тип удаленных компиляторов и утилиты make, с помощью которых выполнялась сборка. Файлы проекта находятся в пользовательском каталоге ``.netbeans/remote/`` на удаленном узле. |
| |
| image::images/remotedev-built-small.png[] |
| |
| После настройки удаленного узла различия в рабочем процессе незаметны. Разработчик может пользоваться всеми функциями редактора (сборка, запуск, тестирование и отладка) таким же образом, как при локальной работе. |
| |
| |
| == Запуск сеанса работы с терминалом на удаленном узле |
| |
| Можно запустить сеанс работы с терминалом безопасного интерпретатора команд (ssh) в рамках среды IDE для подключения к удаленной или локальной системе. Эта функция в особенности подходит для платформ Windows, изначально не поддерживающих SSH. |
| |
| 1. Нажмите на значок терминала в левой части окна 'Результаты'. |
| image::images/remotedev-terminal-icon.png[] |
| |
| В IDE открывается вкладка 'Терминал' и осуществляется переход к локальному или удаленному рабочему каталогу текущего проекта. Если для проекта используется удаленный узел сборки и вы уже подключились к этому узлу через IDE, повторный ввод учетных данных не потребуется. |
| |
| image::images/remotedev-terminal.png[] |
| |
| Во внутреннем терминале IDE можно выполнять любые действия, которые выполняются во время сеанса подключения к удаленному узлу по протоколу SSH. |
| |
| Чтобы начать новый локальный или удаленный терминальный сеанс, используйте значки в левой части вкладки 'Терминал' или пункт меню 'Окно > Результаты> Терминал'. |
| |
| |
| == Рекомендации по удаленной разработке |
| |
| * Также можно переключить проект на другой узел сборки. Для этого щелкните правой кнопкой мыши узел проекта и выберите 'Выбрать узел сборки'. |
| image::images/remotedev-set-remote-host-menu.png[] |
| * Свойства удаленного узла сборки можно изменить после первоначальной настройки. Для этого щелкните правой кнопкой мыши узел в окне 'Службы' и выберите 'Свойства'. |
| * Если удаленный узел используется для сборки и запуска приложения с графическим интерфейсом, можно выбрать в свойствах узла параметр "Включить перенаправление X11" для отображения интерфейса пользователя в локальной системе при его выполнении на удаленном узле. |
| * Если в ходе сборки проекта выполняется компиляция библиотек или создание других файлов в дополнение к основному продукту построения, среда IDE выведет запрос на загрузку файлов в локальную систему. При этом можно выбрать измененные файлы для загрузки. |
| * С проектами можно работать в полностью удаленном режиме, когда сам проект и средства находятся на удаленном узле. Дополнительные сведения см. во встроенной справке IDE или статье link:./remote-modes.html[+Режимы удаленной разработки на C/C++ +]. |
| * Данные по удаленному узлу и средствам доступны в меню среды IDE "Сервис", а также в окне "Службы". Выберите Сервис > Параметры > C/C++ > Средства сборки и нажмите кнопку 'Изменить' рядом со списком 'Узел сборки'. |
| * При использовании функции совместного доступа к файлам проекта можно отобразить локальный и удаленный путь к папкам совместного доступа при помощи функции "Отображение пути". Настроить подключенные пути можно одним из следующих способов: |
| * В окне 'Службы' откройте категорию 'Узлы сборки C/C++', щелкните правой кнопкой мыши имя узла и выберите 'Указатель путей'. |
| * В меню IDE 'Сервисы' выберите 'Параметры > C/C++ >Средства сборки', нажмите кнопку 'Изменить', выберите удаленный узел и нажмите кнопку 'Отображение пути'. |
| |
| |
| == См. также |
| |
| Подробнее см. в следующих местоположениях. |
| |
| * Меню 'Справка' в IDE обеспечивает доступ к обширной информации об использовании IDE. |
| |
| * Различные способы работы в режиме удаленной разработки описаны в статьеlink:./remote-modes.html[+Режимы удаленной разработки на C/C+++] |
| |
| * link:https://netbeans.org/kb/trails/cnd.html[+Учебные карты C/C+++] содержат несколько статей и учебных руководств по разработке на C/C++ в IDE. |
| |
| link:mailto:users@cnd.netbeans.org?subject=Feedback:%20C/C++%20Remote%20Development%20-%20NetBeans%20IDE%208.0%20Tutorial[+Отправить отзыв по этому учебному курсу+] |
| |
| |