что такое cli как и зачем он используется
Common Language Infrastructure (CLI) для веба
Внимание, перевод одного интересного поста из блога Мигеля!
Последние дни Joe Hewitt в твиттере сильно переживал за состояние клиентских веб технологий. TechCrunch вели репортаж о состоянии прогресса в их обзоре The State Of Web Development Ripped Apart In 25 Tweets By One Man (Состояние Веб Разработки в 25 твитах одного человека).
Сегодня Joe предложил блестящую идею:
Если встроить ECMA CLI в браузеры вместо ECMAScript, веб стал бы намного гибче.
ECMA CLI дала бы вебу и строго типизированные и динамические языки программирования. Она дала бы разработчикам выбор между производительностью и скриптуемостью. Выбор языка программирования (использование оптимальных инструментов под конкретную задачу) сделал бы веб страницы намного быстрее, просто переведя жизненно важный код на строго типизированные языки.
Разнообразные языки программирования стали бы первоклассными жителями клиенского веба. Много языков доступно уже и сейчас, но они работают при помощи плагинов. Они могут исполняться на Flash или Silverlight, но этот путь пока не настолько гладок: они работают на отдельных виртуальных машинах, они ограничены тем, как происходит взаимодействие с браузером через убогий API (существует около 20 методов интеграции плагина с браузером, и наиболее продвинутые сценарии взаимодействия требуют серьезных хаков и глубоких знаний внутреннего устройства конкретного браузера).
Возможно настало время поэкспериментировать с интеграцией ECMA CLI в браузер. Не как отдельным плагином, не как плагином-платформой, а как первоклассной виртуальной машиной внутри самого браузера, работающую параллельно с движком Javascript-а.
Что такое GUI и CLI
Когда вы переходите на Linux, то, читая статьи по теме или общаясь на форумах, часто сталкиваетесь с такими терминами, как GUI, CLI и реже TUI. В этой небольшой статье мы расскажем, что они означают, и разберёмся, в каком контексте эти аббревиатуры обычно встречаются.
Справедливости ради отметим, что термины GUI, CLI и TUI популярны не только в Linux-среде. Эти слова – часть общекомпьютерного жаргона, и их можно услышать в любых технических обсуждениях, а не только в тех, которые связаны с Linux.
GUI – графический интерфейс пользователя
GIMP: GUI-приложение для обработки изображений
В Linux возможность графически взаимодействовать с операционной системой предоставляется так называемой средой рабочего стола. Поверх неё можно пользоваться GUI-приложениями, такими как GIMP, VLC, Firefox, LibreOffice, файловый менеджер и т.д. для решения различных задач.
VLC: медиапроигрыватель с GUI
Именно GUI открыл мир компьютеров для обычных пользователей; без него информационные технологии оставались бы уделом гиков.
CLI – интерфейс командной строки
CLI (Command Line Interface) – это программа в командной строке, которая читает вводимые команды и выполняет запрошенные действия. В целом, любая программа, которой можно пользоваться через команды из терминала, попадает в эту категорию.
APT: пакетный менеджер с CLI в Debian-based дистрибутивах
У старых компьютеров не было мыши или других манипуляторов для управления операционной системой. Всё взаимодействие выполнялось через текстовый ввод и вывод, т.е. через CLI.
Если вам кажется, что это сложно, подумайте об ещё более древних вычислительных машинах, у которых не было даже экрана, на котором отображается набираемый текст. Ввод команд распечатывался принтером на бумаге. Лично мне ни разу в жизни не доводилось пользоваться таким компьютером. Ближайший аналог из того, с чем я имел дело – это схемы на микроконтроллерах, которыми я занимался во время учёбы.
Ушёл ли CLI в прошлое? Вовсе нет. У командной строки есть свои преимущества, особенно если речь идёт о настройке Linux на глубинном уровне: поднятии сетевого брандмауэра, организации локальной сети или даже управлении пакетами.
Со всеми этими вопросами можно разобраться и с помощью GUI-программ, но CLI даёт более прямой и прицельный доступ к операционной системе. В любом случае, работа GUI-приложений также основана на обращении к ОС с помощью команд (которые прописаны в их программном коде).
Многие известные утилиты с GUI представляют из себя графическую обёртку для инструментов CLI. Например Handbrake, популярный медиа-конвертер с открытым исходным кодом, является GUI-надстройкой над CLI-приложением ffmpeg.
Рабочее окно Handbrake
Конечно, пользоваться командной строкой сложнее, чем графическим интерфейсом. Однако не стоит переживать по этому поводу. Как правило, для решения повседневных задач достаточно графического управления Linux. Тем не менее, знание основных команд часто бывает весьма полезным.
TUI – текстовый пользовательский интерфейс
Этот термин встречается реже, чем первые два. TUI (Text User Interface) – это наполовину CLI и наполовину GUI. Непонятно, что это значит? Разберёмся поподробнее.
Как было сказано выше, работа со старыми компьютерами была целиком основана на CLI. Однако некоторый ограниченный спектр возможностей GUI можно имитировать и в текстовом терминале. Это и будет TUI: в отличие от интерфейса командной строки, в нём представлено больше виджетов и доступно управление как и с клавиатуры, так и с помощью мыши.
Links: терминальный браузер
TUI – это сокращение для text-based user interface (текстовый пользовательский интерфейс) или terminal user interface (терминальный пользовательский интерфейс). Слово «текстовый» в этом словосочетании означает, что всё показанное на экране, в сущности, представляет собой большой текст – набор символов, с помощью которого имитируются различные элементы управления, а слово «терминальный» – что обратиться к этому интерфейсу возможно только из терминала.
TUI-приложения не так популярны, как GUI и CLI, но примеров можно найти множество. Так, к этой категории относятся текстовые браузеры и текстовые игры.
Ещё один случай, когда TUI может встретиться – это если в процессе установки кодеков на Ubuntu необходимо принять EULA или сделать выбор из нескольких предложенных вариантов настройки. TUI сложнее в управлении, чем GUI и часто требует обучения, но пользоваться им всё-таки проще, чем командной строкой.
Выводы
Программы с TUI часто относят в категорию CLI, поскольку их интерфейс доступен только из текстовой консоли. Какого мнения на этот счёт будете придерживаться вы – выбор за вами. Надеюсь, вам понравилась эта статья и теперь вы знаете что такое GUI, CLI и TUI.
Документация по интерфейсу Command-Line (CLI)
Интерфейс командной строки центра приложений — это единое средство для запуска служб центра приложений из командной строки. Интерфейс командной строки — это мощный инструмент для использования служб центра приложений и создания сценариев для выполнения последовательности команд. В настоящее время вы можете войти в систему и просмотреть или настроить все приложения, к которым у вас есть доступ в центре приложений.
Дополнительные сведения об установке CLI и поддерживаемых в настоящее время командах см. в репозитории GITHUB CLI центра приложений.
Приступая к работе
Предварительные требования
Рекомендуемая версия Node.js — 12 или более поздняя.
Установка
Использовать команды CLI центра приложений можно двумя способами, не запуская их appcenter login раньше:
Выполнение первой команды CLI
Дополнительные сведения о списке команд интерфейса командной строки см. в репозитории GITHUB CLI центра приложений.
Из-за ограничений, касающихся анализа имен приложений, имена приложений не должны начинаться с дефисов или других неоднозначных символов, которые могут запутать средства синтаксического анализа стиля GNU. Дополнительные сведения см. в связанном выпуске CLI.
Использование прокси-сервера
Интерфейс командной строки можно использовать через прокси-сервер. Для этого необходимо настроить npm config и указать переменную среды с адресом прокси-сервера. Обратите внимание, что адреса прокси должны быть указаны с помощью протоколов (например, http:// ).
Конфигурация NPM
Чтобы настроить использование прокси-сервера в NPM, необходимо выполнить команды:
Переменная среды
Чтобы настроить команду запуска переменной среды, выполните следующие действия:
Создаем CLI-приложение с помощью React.js
Приложения с интерфейсом в виде командной строки (Command-Line Interface — CLI) стали популярными в экосистеме разработчиков по целому ряду причин. Самые банальные из них — это простота использования (CLI) и то, что многие важнейшие инструменты разработки представляют из себя терминальные приложения или предоставляют интерфейс командной строки, и многие разработчики уже к ним привыкли.
По мере того, как сложность и функциональность этих терминальных приложений растет, также растет и потребность в простоте и быстроте их создания.
В нашей предыдущей статье мы рассказали вам о том, как создать CLI-приложение с помощью Node.js. Один из ключевых выводов после построения интерфейса командной строки с использованием Node.js заключался в том, что делать это достаточно сложно и утомительно.
React же упрощает создание мощных и очень интерактивных CLI-приложений. В этой статье мы реализуем командную строку с помощью React.js вместо Node.js и увидим разницу.
Что от вас требуется:
Базовое понимание JavaScript.
Базовые знания React.js.
Базовые знания npm и/или yarn.
Почему React.js, а не Node.js?
React освобождает нас от всех хлопот по синтаксическому анализу (парсингу) аргументов, выполняя их в фоновом режиме. React также позволяет рендерить компоненты в терминале, так как вы бы делали это в браузере.
Чтобы реализовать интерфейс командной строки с помощью React, мы будем использовать библиотеку под названием INK, которая значительно упростит нашу работу. Ink также позволяет вам использовать flexbox, то есть нам больше не нужно полагаться на раскрашенные стринговые выводы, как в Node.js.
Для примера вот несколько популярных приложений, сделанных с помощью React и Ink:
Начало работы с React INK
Ink — это фреймворк React.js, который значительно упрощает утомительную задачу создания CLI-приложений. По сравнению с Node.js Ink не требует от вас особого обучения работе с ним. Если вы знакомы с React, тогда вы готовы.
Начнем с создания простого Hello World приложения. Для этого нам понадобятся React и Ink из нашего npm. Чтобы упростить нашу работу, ink поставляется с командой для бутстрапа React CLI-приложения.
Введите в терминале:
Последняя команда создает исполняемый файл для нашего приложения. Для завершения этого процесса может потребоваться некоторое время. Когда вы запустите node cli в терминале, он должен вернуть следующее:
image
Вот она, ваша первая командная строка на основе React. Чтобы добиться этого в Node.js, нам потребовалось бы написать много кода, и это заняло бы больше времени, не говоря уже о большем количестве задействованных библиотек.
Простой проект
Давайте продолжим работу над чуть более сложным проектом — это поможет вам понять элементы и структуру проекта React ink. Мы будем работать в файле ui.js. Файл входа для приложения — cli.js..
Код будет выглядеть примерно так:
Сначала мы импортируем React из пакета react. Затем мы импортируем элемент Text, который поставляется с пакетом ink. У нас также есть функция, которая принимает на вход имя и рендерит его. Давайте создадим простое CLI-приложение, которое принимает страну в качестве входных данных. Затем оно возвращает некоторую информацию об этой стране в виде таблицы.
Для этого нам понадобится пакет npm под названием world-countries-capitals, который содержит информацию о странах.
Начнем с ввода данных пользователем. Для этого нам понадобится ввод текста (text input). К счастью для нас, ink уже предоставляет для этого пакет. Просто запустите:
Мы импортируем и используем ввод текста в терминале в нашем ui.js. Мы также будем использовать хук React useState для хранения значения нашей страны и обработки изменений ее названия. Проще говоря, думайте о хуках useState как о способе работы с переменными в React. Чтобы узнать больше о хуках React, я рекомендую почитать эту документацию.
Теперь наш код будет выглядеть так:
При запуске node cli в терминале, у вас должна появиться возможность ввести название страны.
Нам нужно будет искать страну в режиме реального времени и отображать результаты в таблице. Для этого мы вызовем npm-пакет world-countries-capitals. Мы будем использовать еще один хук React useEffect для извлечения наших данных и обновления компонента по мере его рендеринга. Давайте реализуем это.
Сначала установим и импортируем пакет.
Введите в терминале:
Мы импортируем этот пакет вверху нашего файла:
Наконец, мы заполняем наши переменные информацией из npm-пакета. В итоге наш хук useEffect будет выглядеть так:
Внутри элемента Box под элементом TextBox мы и добавим нашу таблицу:
Давайте добавим баннер в наше приложение. Просто потому, что мы можем. Мы добавим его в корневой элемент Box поверх ввода текста.
Теперь наш код выглядит так:
Он должен вернуть это:
Вы можете посмотреть гифку работы приложения по этой ссылке ссылке.
Примечание: запуск тестовой команды (npm run test) не сработает, потому что мы не написали никаких тестов. Ink по умолчанию использует для тестирования ava. Вы можете прочитать больше об ava в этой документации.
Заключение
Создавать CLI-приложения еще никогда не было так просто. Получайте удовольствие, создавая более сложные и красивые приложения с интерфейсом командной строки. Чтобы ознакомиться с кодом, использованный в статье, вы можете перейти по этой ссылке.
Домашнее задание: на данный момент приложение вылетает, когда пользователь вводит несуществующую страну или совершает опечатку. Чтобы узнать больше о кастомных хуках React Ink и попрактиковаться в хуках React, попробуйте исправить эту ошибку, например, чтобы отображалась пустая таблица или сообщение об ошибке. Отправьте решение как PR в репо проекта.
Всех желающих приглашаем на бесплатное demo-занятие «Карточка товара». На открытом вебинаре создадим карточку товара. Возьмем за основу макет по продаже мебели, сделанный в figma, добавим html, css, анимации и js, если потребуется.
>> РЕГИСТРАЦИЯ
C++/CLI — «клейкий» язык
Это довольно распространённая задача, ведь на C/C++ написаны тонны проверенного временем высокопроизводительного кода, который невозможно переписать на управляемые языки.
Microsoft предлагает два варианта решения проблемы.
P/Invoke
Первый — это механизм Platform Invoke, с помощью которого можно использовать библиотеки с C ABI. Выглядит это как-то так:
P/Invoke обеспечивает маршаллинг (трансляцию) всех простых типов данных, а так же строк, структур с полями, и даже callback-функций (делегатов).
Но что, если у библиотеки нет C-интерфейса, или возможностей P/Invoke не хватает? На помощь приходит C++/CLI.
Это идеальный язык для генерации glue code между managed и unmanaged средами исполнения, поскольку он позволяет генерировать код для обоих сред + генерирует transition code, избавляя нас от необходимости склеивать что-то вручную.
Итак, нам понадобится Visual C++ Express 2008. Кликаем на «New Project», выбираем тип проекта — CLR. Это создаст проект с по умолчанию выставленной опцией /clr (Use Common Language Runtime). Это означает, что компилятор сгенерирует корректную MSIL-сборку и даст нам использовать новый синтаксис — который мы сейчас и рассмотрим.
Crash course
Выделение managed/unmanaged-блоков
По умолчанию, компилятор считает весь C++-код проекта нацеленным на компиляцию в MSIL. Скорее всего, это не будет работать (не скомпилируется), а если и скомпилируется, то это с большой вероятностью не то, чего вам хотелось бы.
Специальные команды препроцессора позволяют указать, какую часть кода надо компилировать в x86, а какую — в MSIL.
Подключение MSIL-сборок
Namespaces
Здесь так же, как в обычном C++:
Объявление value-типа
Это то, что в C# называется «struct».
Объявление reference-типа, методы, properties
Кстати, что интересно, C++/CLI поддерживает некоторые фичи CLR, которые не реализованы в языке C#. Например, property indexers — можно определять индексаторы (оператор []) для отдельных свойств, а не только для класса целиком. Вот только такой код нельзя будет вызвать из C# 🙂
Объявление интерфейсного типа
То, что в C# называется «interface»:
Enum-ы
Жизнь внутри метода — базовый синтаксис
Generics, type constraints, массивы
Здесь ключевое слово generic используется аналогично template в C++:
Делаем обертку для неуправляемого ресурса
Очень частая задача. Используем паттерн IDisposable.
Обратите особое внимание, что С++-деструктор в ref-классе автоматически транслируется в метод Dispose (). Для финализаторов используется другой синтаксис.
Получаем сырой указатель на GC-объект
Эта операция в архитектуре CLR называется «pinning». При «прибивании» объекту запрещается перемещаться в куче при сборке мусора и уплотнении кучи. Это позволяет неуправляемому коду воспользоваться адресом объекта и записать/прочитать что-нибудь по этому адресу.
Будьте осторожны, так как прибивание объектов мешает сборщику мусора и сильно фрагментирует кучу. Эта операция предназначена для лишь для кратковременных манипуляций с объектами кучи.
«Pinned»-указатели реализованы в C++/CLI как шаблонный RAII-тип
Маршаллинг строк
Конвертим System::String в wide char строку (wchar_t *):
Конвертим System::String в ANSI C строку (RAII-контейнер):
Конвертим ANSI-строку в System::String:
Жонглируем ссылками на GC-объекты в unmanaged-коде
Часто возникает задача передать ссылку на управляемый объект куда-то в неуправляемый код. Или даже хранить её в поле неуправляемого объекта. Но компилятор C++/CLI устанавливает четкие границы сред и не поддерживает такую демократию. Поэтому, на помощь приходит вспомогательный контейнер
Заключение
В этой статье я описал не всё, но уж точно самое необходимое. Остальное без труда находится в MSDN.





