Анатомия терминала. Осваиваем текстуальную графику - «Новости» » Самоучитель CSS
Меню
Наши новости
Учебник CSS

Невозможно отучить людей изучать самые ненужные предметы.

Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3

Надо знать обо всем понемножку, но все о немногом.

Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы

Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)

Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода

Самоучитель CSS

Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5

Новости

Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости

Справочник CSS

Справочник от А до Я
HTML, CSS, JavaScript

Афоризмы

Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы

Видео Уроки


Наш опрос



Наши новости

       
16-02-2022, 00:01
Анатомия терминала. Осваиваем текстуальную графику - «Новости»
Рейтинг:
Категория: Новости

Anatomy of a Terminal Emulator, допол­ненный врез­ками от редак­ции «Хакера». Перевод и текст вре­зок — Юрий Язев.

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


При­меры кода я при­вел на язы­ке Rust, в то же вре­мя я буду ста­рать­ся делать их как мож­но про­ще и короче, что­бы даже нез­накомо­му с Rust прог­раммис­ту было все понят­но. Кро­ме того, я под­робно опи­шу зна­чимые час­ти кода. Мы рас­смот­рим работу эму­лято­ра тер­минала в Linux, но с таким же успе­хом ты можешь при­менить све­дения в любой дру­гой Unix-подоб­ной сис­теме (нап­ример, в macOS).


Ма­тери­ал рас­счи­тан на нович­ков в раз­работ­ке тер­миналь­ных при­ложе­ний, тем не менее я ста­рал­ся сде­лать его полез­ным и для ветера­нов раз­работ­ки при­ложе­ний коман­дной стро­ки.


Анатомия терминала. Осваиваем текстуальную графику - «Новости»


Установка Rust


Что­бы уста­новить Rust в Linux или macOS, надо выпол­нить в коман­дной стро­ке сле­дующую коман­ду:


curl --proto '=https' --tlsv1.2 -sSfhttps://sh.rustup.rs | sh

В macOS ее выпол­нение про­ходит без суч­ка, без задорин­ки. Одна­ко в Linux могут воз­никнуть раз­ные проб­лемы, нап­ример свя­зан­ные с отсутс­тви­ем curl. Если ты не хочешь тра­тить вре­мя на их решение, можешь уста­новить Rust из офи­циаль­ного репози­тория сис­темы. С 20-й вер­сии Ubuntu сре­ди ее пакетов есть Rust. В этом слу­чае в коман­дной стро­ке надо наб­рать сле­дующее:


sudo apt install rustc

Cargo

Вмес­те с ком­пилято­ром язы­ка Rust уста­нав­лива­ется сис­тема сбор­ки Cargo. Ее исполь­зуют, что­бы управлять про­екта­ми, а кро­ме это­го, она игра­ет роль пакет­ного менед­жера. С ее помощью соз­дают­ся, объ­еди­няют­ся, стро­ятся про­екты и ска­чива­ются зависи­мые биб­лиоте­ки.


Что­бы соз­дать про­ект, набери в кон­соли cargo new HelloRust.


В резуль­тате будет соз­дан про­ект с таким содер­жимым.


Со­дер­жимое пап­ки с про­ектом

Ис­ходный код прог­раммы HelloRust содер­жится в фай­ле main.rs, который, в свою оче­редь, находит­ся в пап­ке src.


Файл Cargo.toml содер­жит метадан­ные опи­сания про­екта:


[package]
name = "HelloRust"
version = "0.1.0"
edition = "2022"
[dependencies]

Кро­ме того, в нем ука­зыва­ются биб­лиоте­ки, исполь­зуемые для ком­пиляции прог­раммы (ниже клю­чево­го сло­ва [dependencies]). Все рас­смат­рива­емые в статье при­меры обра­щают­ся к либе nix = "0.17.0".


Что­бы ском­пилиро­вать при­мер, надо выпол­нить коман­ду cargo build, находясь в пап­ке с про­ектом. А что­бы запус­тить про­ект на выпол­нение, нуж­но наб­рать коман­ду cargo run. Она не толь­ко запус­тит прог­рамму на выпол­нение, но и пересо­берет ее, если в исходный код будут вне­сены изме­нения.


Где писать Rust-код?

В любой удоб­ной для тебя IDE, под­держи­вающей под­свет­ку син­такси­са. Это в иде­аль­ном слу­чае. Пла­гины под­дер­жки язы­ка сущес­тву­ют для мно­гих сред, нап­ример VS Code. Но мож­но вос­поль­зовать­ся абсо­лют­но любым тек­сто­вым редак­тором. Это уже на твое усмотре­ние.


Ес­ли рас­смат­рива­емая тема тебе инте­рес­на, напиши об этом в ком­мента­рии. Мы подума­ем над новыми стать­ями, пос­вящен­ными это­му язы­ку.



 

Разные части терминала


Вре­мя от вре­мени эму­лятор тер­минала называ­ют коман­дной стро­кой (обо­лоч­кой) или pty (псев­дотер­миналом). Для начала обсу­дим смыс­ловую наг­рузку этих наз­ваний и решим, в каких кон­тек­стах они могут исполь­зовать­ся.


Эму­лятор тер­минала име­ет длин­ную исто­рию, но мы скон­цен­три­руем­ся на тех вещах, которые под­разуме­вают­ся под этим сло­вом в наши дни. Как эму­лятор тер­минала (gnome terminal, alacritty, rxvt-unicode), так и коман­дная обо­лоч­ка (bash, zsh, fish) пред­став­ляют собой при­ложе­ния, выпол­няемые под управле­нием опе­раци­онной сис­темы.


Эму­лятор тер­минала — это гра­фичес­кое при­ложе­ние, которое пре­обра­зует пос­тупа­ющие из коман­дной обо­лоч­ки дан­ные и отоб­ража­ет их на экра­не. Обыч­но вывод тек­сто­вый, но могут быть исклю­чения. Их мы рас­смот­рим даль­ше.


Ко­ман­дная обо­лоч­ка (у нас рас­простра­нено корот­кое наз­вание shell) пре­дос­тавля­ет интерфейс к опе­раци­онной сис­теме, поз­воля­ет поль­зовате­лю вза­имо­дей­ство­вать с ее фай­ловой сис­темой, запус­кать про­цес­сы, а иног­да — выпол­нять скрип­ты.


Эти две прог­раммы соеди­няют­ся с помощью pty (pseudoterminal), который орга­низу­ет дву­нап­равлен­ный асин­хрон­ный канал свя­зи меж­ду ними. В одном нап­равле­нии pty переда­ет дан­ные от тер­минала к обо­лоч­ке (STDIN), во вто­ром — от обо­лоч­ки к тер­миналу (STDOUT). Дру­гими сло­вами, ког­да поль­зователь вво­дит коман­ды в тер­минал, пос­ледний пересы­лает их через канал STDIN псев­дотер­минала (pty) в обо­лоч­ку. С дру­гой сто­роны, ког­да обо­лоч­ка готова показать поль­зовате­лю резуль­тат на экра­не, она отправ­ляет дан­ные в тер­минал по каналу STDOUT псев­дотер­минала.


Как вид­но, у pty име­ются две сто­роны. Мы будем называть их «пер­вичная» и «вто­рич­ная», хотя в офи­циаль­ной докумен­тации они называ­ются master и slave. На пер­вичной сто­роне находит­ся эму­лятор тер­минала, на вто­рич­ной — коман­дная обо­лоч­ка. Тем не менее на вто­рич­ной сто­роне может рас­полагать­ся любая прог­рамма, ожи­дающая под­клю­чения тер­минала, нап­ример Vim или Top.


Пред­лагаю взгля­нуть на кар­тинку, демонс­три­рующую, как эта сис­тема работа­ет в целом, на при­мере коман­ды ls.


Про­цесс ls получа­ет от опе­раци­онной сис­темы дан­ные и переда­ет их сна­чала коман­дной обо­лоч­ке, а та, в свою оче­редь, по каналу STDOUT pty эму­лято­ру тер­минала 

Как эмулятор терминала интерпретирует и отображает данные, полученные из командной оболочки?


Ког­да коман­дная обо­лоч­ка отправ­ляет текст тер­миналу, она исполь­зует весь дос­тупный ей набор инс­трук­ций. Ты мыс­лишь в пра­виль­ном нап­равле­нии, если наз­вал этот набор escape-сим­волами ANSI. Они исполь­зуют­ся, ког­да коман­дной обо­лоч­ке надо каким‑либо обра­зом фор­матиро­вать вывод: изме­нить цвет/стиль шриф­та или перемес­тить кур­сор вво­да. Что­бы уви­деть, как это работа­ет, давай напишем неболь­шую прог­рам­мку на Rust, которая соз­дает псев­дотер­минал (pty) и на вто­рич­ной сто­роне запус­кает пре­доп­ределен­ную в кон­крет­ной сис­теме коман­дную обо­лоч­ку. Таким обра­зом мы смо­жем уви­деть, какие дан­ные из недр сис­темы нам шлет shell.



unimplemented!()}fn spawn_pty_with_shell(default_shell: String) -> RawFd {
unimplemented!()}fn main() {
let default_shell = std::env::var("SHELL").expect("could not find default shell from $SHELL");
let stdout_fd = spawn_pty_with_shell(default_shell);
let mut read_buffer = vec![];
loop {match read_from_fd(stdout_fd) {Some(mut read_bytes) => {read_buffer.append(&mut read_bytes);}None => {println!("{:?}", String::from_utf8(read_buffer).unwrap());std::process::exit(0);}}
}}


www


Ис­ходные коды при­меров в статье мож­но най­ти в ре­пози­тории авто­ра.



Фун­кция main начина­ется с того, что мы получа­ем путь к сис­темной коман­дной обо­лоч­ке из перемен­ной окру­жения SHELL. В слу­чае ошиб­ки фун­кция expect выводит сооб­щение. Далее вызыва­ется фун­кция spawn_pty_with_shell, которой в качес­тве парамет­ра переда­ется получен­ный на прош­лом шаге путь к сис­темной обо­лоч­ке. Внут­ри фун­кции обо­лоч­ка запус­кает­ся в новом про­цес­се на вто­рич­ной сто­роне pty. Но этот момент рас­смот­рим ниже.


Anatomy of a Terminal Emulator, допол­ненный врез­ками от редак­ции «Хакера». Перевод и текст вре­зок — Юрий Язев. В статье мы погово­рим о раз­ных час­тях тер­минала и о том, как они вза­имо­дей­ству­ют, напишем неболь­шую про­гу для чте­ния вво­да в коман­дной стро­ке и рас­смот­рим, как она интер­пре­тиру­ет коман­ды. Затем мы обсу­дим, как соз­дать поль­зователь­ский интерфейс в тер­миналь­ном при­ложе­нии. И в кон­це кон­цов уви­дим, как мож­но исполь­зовать все это ради шут­ки. При­меры кода я при­вел на язы­ке Rust, в то же вре­мя я буду ста­рать­ся делать их как мож­но про­ще и короче, что­бы даже нез­накомо­му с Rust прог­раммис­ту было все понят­но. Кро­ме того, я под­робно опи­шу зна­чимые час­ти кода. Мы рас­смот­рим работу эму­лято­ра тер­минала в Linux, но с таким же успе­хом ты можешь при­менить све­дения в любой дру­гой Unix-подоб­ной сис­теме (нап­ример, в macOS). Ма­тери­ал рас­счи­тан на нович­ков в раз­работ­ке тер­миналь­ных при­ложе­ний, тем не менее я ста­рал­ся сде­лать его полез­ным и для ветера­нов раз­работ­ки при­ложе­ний коман­дной стро­ки. Установка Rust Что­бы уста­новить Rust в Linux или macOS, надо выпол­нить в коман­дной стро­ке сле­дующую коман­ду: curl --proto '=https' --tlsv1.2 -sSf https:/ / sh. rustup. rs | sh В macOS ее выпол­нение про­ходит без суч­ка, без задорин­ки. Одна­ко в Linux могут воз­никнуть раз­ные проб­лемы, нап­ример свя­зан­ные с отсутс­тви­ем curl. Если ты не хочешь тра­тить вре­мя на их решение, можешь уста­новить Rust из офи­циаль­ного репози­тория сис­темы. С 20-й вер­сии Ubuntu сре­ди ее пакетов есть Rust. В этом слу­чае в коман­дной стро­ке надо наб­рать сле­дующее: sudo apt install rustc Cargo Вмес­те с ком­пилято­ром язы­ка Rust уста­нав­лива­ется сис­тема сбор­ки Cargo. Ее исполь­зуют, что­бы управлять про­екта­ми, а кро­ме это­го, она игра­ет роль пакет­ного менед­жера. С ее помощью соз­дают­ся, объ­еди­няют­ся, стро­ятся про­екты и ска­чива­ются зависи­мые биб­лиоте­ки. Что­бы соз­дать про­ект, набери в кон­соли cargo new HelloRust. В резуль­тате будет соз­дан про­ект с таким содер­жимым. Со­дер­жимое пап­ки с про­ектомИс­ходный код прог­раммы HelloRust содер­жится в фай­ле main.rs, который, в свою оче­редь, находит­ся в пап­ке src. Файл Cargo.toml содер­жит метадан­ные опи­сания про­екта: _

Теги: CSS

Просмотров: 468
Комментариев: 0:   16-02-2022, 00:01
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

 
Еще новости по теме:



Другие новости по теме: