company_banner

Сага о том, как мы писали консоль

                Если посадить тысячу мартышек за тысячу пишущих машинок, то за тысячу лет они напишут эмулятор терминала. — вместо эпиграфа.

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

    Когда мы только запускали облако, первой проблемой было «как нам получить консоль». Штатный механизм XCP поразумевает, что консоль рисуется с помощью VNCTerm, а желающий её увидеть должен сначала пойти в XenAPI, получить там session-id консоли, пойти на порт консоли, передать session-id, получить RFB, завёрнутый в HTTP, развернуть HTTP, вынуть RFB (он же VNC), отдать её локальному рендереру VNC (VNC-клиенту или java-апплету с тем же функционалом). При этом консоль закрывалась (сессия рвалась) при каждой перезагрузке виртуальной машины. Она рвалась даже при миграции виртуальной машины. Другими словами, это была технология, которая подразумевала «глянул одним глазком, починил ssh/iptables и забыл». Неудобно, медленно, сложно. Выкатывать такое в продакт совсем не хотелось.

    И я залез в дебри serial-howto, console-howto и ещё несколько ужасных документов, рассказывающих о том, как правильно нужно конфигуриовать прерывания на ISA плате у мультикарт, а так же специфику настройки linux-2.2 для работы с оными. Параллельно изучалось устройство консоли в зене (внимательный читатель мог даже заметить, когда именно я более-менее разобрался в этом вопросе — я писал на хабре краткий обзор того, что происходит с консолью).

    После этого пришла мысль: нужно писать своё, потому что готового чужого хорошего нет.

    Сначала мы хотели взять хотя бы готовые компоненты и сделать из них своё. Я помню до сих пор ту замечательную схему, в которой мы планировали сохранять в БД вывод anyterm'а, делать двойное туннелирование последовательного порта с использованием UDP… Выглядело это, мягко скажем, неприглядно.

    Потом пришла в голову мысль выпилить anyterm. Для этого нужно было посмотреть, как работают терминалки. Это было очень забавно и поучительно (желающие могут изучить исходный текст PuTTY). Главной проблемой в этом изучении было то, что они много рисуют на экран. Прямо в процессе обработки ввода. Отделить специфику DC от, собственно, того, что является консолью, было сложно.

    Через некоторое время мы пришли к идее «нам нужен свой эмулятор терминала».
    Задача казалась относительно простой, пока мы не прикоснулись к бездне, именуемой «escape-коды и типы терминалов...».

    Пишущие машинки


    Итак, в начале была пишущая машинка. В какой-то момент возникло желание совместить телеграф с пишущей машинкой. Так возник телетайп
    Разумеется, инженерам, создававшим телетайп, не было никакого резона делать все с нуля. Они просто приделали коды к каждой клавише пишущей машинки. После некоторых боёв в стиле MS VS Netscape, был создан стандарт html5 на коды для оных машинок, то бишь телетайпов. Если мне память не изменяет, то это ASCII, где предусмотрены все комбинации клавиш, характерные для американской пишущей машинки. Включая код BELL, который, кстати, должен вовсе не делать BEEP, а делать «дзыньк», ибо у пишущих машинок был именно колокольчик, а не спикер.



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

    Когда кто-то догадался приделать к мейнфрейму монитор и клавиатуру, то он естественным образом постарался обеспечить совместимость с существующими печатающими устройствами. Потом, когда производители начали делать новые модели терминалов, они старались обеспечить поддержку хотя бы базового набора функционала предыдущих версий… Цепочка эта тянулась очень долго vt52 (несовместимый с последующими) — и славная vt100, vt102, vt120, vt200, vt220, vt320, vt420, vt520…

    Эмуляторы терминалов, эмулирующих телетайп, эмулирующего пишущую машинку


    Потом, когда писали линукс, для возможности запускать программы (вроде vim'а, emacs'а или mc) не оставалось ничего, как реализовать поддерку эмулятора терминала… Тем же путём, кстати, пошёл UNIX и его клоны: solaris, FreeBSD, hp-ux и т.д.

    Для графического режима были написаны свои эмуляторы терминалов — самые совершенные из них — это xterm и rxvt (совершенный — это значит, поддерживающий всё, а не самый удобный/красивый). Кстати, самые распространённые — gnome-terminal и konsole — поддерживают далеко не всё и далеко не всё, что поддерживают, обрабатывают правильно (желающие могут сами запустить vttest на своих любимых терминалах и посмотреть на это безобразие).

    Все эти эмуляторы терминалов делали одно и то же — они эмулировали работу терминала, который эмулирует терминалы предыдущих поколений, которые эмулируют телетайп, которые эмулируют пишущую машинку.

    Пишущие машинки never die!


    Живые примеры:

    Например, все уважающие себя терминалы имеют настройку издавать BELL за 8 символов до конца строки. Эта функция бесполезна на терминале — но очень полезна для пишущей машинки.

    Почему мы имеем раздельно коды «Возврат каретки» (догадайтесь, о каретке какой именно машинки идёт речь) и «перевод строки»? Разумеется, потому что на пишущих машинках это были раздельные действия (на наиболее совершенных машинках был рычаг, совмещающий в себе CR/LF).

    Более тонкий и неочевидный пример. Почему символ Backspace не удаляет символ слева, а только сдвигает курсор, а delete символ справа удаляет, да ещё и со сдвигом всей строки?

    Очевидно: на пишущих машинках была кнопка backspace. И, поскольку пишущая машинка может только двигать каретку туда-сюда, а удалять символы не может, то и backspace символ не удаляет. А delete на пишущих машинках не было — и причин делать обратную совместимость не было.

    Матричные принтеры тоже оставили свой неизгладимый оттиск в линуксе. Программа pager умеет эмулировать матричный принтер. Когда при выводе на матричный принтер хотели сделать текст жирным или подчеркнуть, то каретку сдвигали влево и печатали текст снова (или печатали знаки подчёркивания поверх существующего текста). Если в программу pager (pg) скормить такой текст, то она покажет его соответствующе (сэмулирует матричный принтер). Впрочем, я отвёкся от консоли.

    Ещё одной вещью, которая сильно повлияла на современную консоль, было то, как выводилась картинка на экран. Это повлияло на текстовый режим CGA (который, в свою очередь, немало повлиял на линукс). Чтобы понять как это происходило, нужно вспомнить, как выводили текстовое изображение примитивные текстовые экраны:

    В памяти хранились две области — атрибутов и символов (в некоторых реализациях через один, в некоторых — как две раздельные области памяти). Цветовые атрибуты использовались как бинарные ключи для подачи напряжения со стороны R, G, B каналов. Последовательность битов (результат сканирования линии битов из знака шрифта, выбранного по индексу (коду) выводимого символа) коммутировала между двумя вариантами сигнала — цветом фона и цветом тона.

    Появившийся позже атрибут «яркость» всего лишь накидывал к итоговому сигналу дополнительное напряжение. Это же объясняет, почему «ярко чёрный» для консоли, это не deep black, а всего лишь серый. Ну и совсем неожиданным является то, что ярко чёрный по ярко чёрному — вполне различим, он выглядит как тёмно-серный по почти чёрному.

    Ещё одной забавной особенностью является интерпретация атрибута bold — поскольку первые терминалы имели в ассортименте только один шрифт, то показать жирный они никак не могли (в отличие от матричных принтеров) — и решением был показ bold как яркий цвет тона (символов).

    Внутреннее устройство терминала определило и множество других интересных моментов. Например, куда мы должны пойти, если нам передают номера строк и колонок за пределами допустимых значений? Очевидно — в последнее разрешенное значение. А если очень большое? Разумеется, у нас координаты в int8/int16, так что: делать кольцевое переполнение — вполне естественно.

    Ещё одна замечательная вещь, которая пришла в XXI век из века XIX — это табстопы. Когда пишущие машинки стали совершенствоваться, возникла проблема ввода текста в несколько колонок. Решение было изящным — сзади пишущей машинки был длинный ряд штифтов, каждый рамером примерно в ширину символа. Штифт мог быть в нормальном состоянии или вдавленном. Для вдавливания штифта в текущей позиции использовался специальный рычаг. Другой рычаг отпускал каретку (которую тянула пружина) так, чтобы каретка остановилась на заданном табстопе. Ввод текста в этом случае выглядел так «ввести текст, нажать табуляцию», ввести следующий текст.Самые продвинутые пишущие машинки, вроде Башкирия-М, имели кнопки «2Т», «3Т», которые позволяли пропустить несколько табуляций. Как это было реализовано в механике — не знаю. Помимо установки табстопов (их, очевидно, можно было сделать практически на каждой колонке), был рычак «сброса табуляций», который просто «отжимал» все штифты. И разумеется, все терминалы, начиная с vt102 и заканчивая linux-3.0rc2 поддерживают esc-код для «отжатия штифтов табуляции пишущих машинок».

    Наша работа


    Когда мы писали терминал много было непонятно, например, какими становятся табстопы после сброса? (Читатели, воспитанные в msdos неправильно ответят «8»). Ответ нужно смотреть в пишущих машинках. Какие табстопы остаются после отжима всех штифтов? Разумеется, никакие. Пока руками их не сделаешь, ничего не появится. Именно потому команда reset, первые копирайты в которой были поставлены ещё до моего рождения, в ходе сброса терминала посылает код «сброс табстопов», а потом проходится по экрану порциями по 8 пробелов и расставляет столь желанные табстопы через каждые 8 символов. Хотя разные типы терминалов могут воображать себе разный размер «табов по умолчанию».

    В ходе нашей работы над эмулятором терминала, именно эта «железная логика», которая становилась понятна только при воспоминаниях о пишущих машинках, терминалах с 8кб набортной памяти, аппаратным схемам развёртки сигнала и т.д. доставляля наибольшие мучения для программистов. Собственно, для программиста — bobry — автор нашей библиотеки эмуляции терминала.

    Многие поколения терминалов, их эмуляторов и т.д. привели к нескольким стандартам разной степени размытости и железному правилу писателя софтового эмулятора терминала — mimic legacy. Полноценной документации по коду терминалок нет ни у кого (даже мануал по vt102, огромный талмуд, всё же имеет довольно много мутных мест).

    Ситуацию с документацией по терминалам можно описать примерно так: у нас есть отличная документация по терминалам и их кодам, большая её часть написана на Си и может противоречить друг другу.

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

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

    Собственно, главный виновник торжества, основной и главный автор библиотеки — это bobry, мужественно сражавшийся с бездной легаси, си и longjump'ов в коде xterm'а (под мой аккомпанимент троллинга на тему compability с пишущими машинками и amazing stories про природу табстопов — бабушкина «Баширия-3М» всё-таки пригодилась, не зря я с ней возился в голодные и холодные 90ые в районе 90-93 годов...). Вполне серьёзно могу сказать, что он на настоящий момент — один из немногих программистов в стране (особенно — молодых программистов, не заставших PL/I в продакте), который хорошо знает про то, как устроена консоль линукса, знает esc-коды и прочие ужасы тайной кухни эмуляции терминалов… Кстати, название ncurses — библиотеки для рендеринга изображения с использованием esc-кодов, вообще говоря, идёт от английского to curse — высказывать благодарность за удобную и понятную вещь.

    Впрочем, похвалю нас ещё раз:

    В настоящий момент наша библиотека — одна из лучших, и уж точно лучшая среди тех, которые не рисуют сразу же на экран. Кстати, это главная особенность нашей библиотеки — она позволяет оперировать с изображением терминала в отрыве от того, как оно рисуется. Именно это и позволило нам, например, легко и непринуждённо писать на терминал сообщение о том, что виртуальная машина была завершена принудительно (если пользователь убивает машину принудительно). Сама виртуальная машина к этому моменту уже остановлена — и мы, хитрой сапой просто дописываем в неё сообщение о завершении работы. Обычные игры с vncterm такого сделать не позволят.

    В следующей части я расскажу подробнее об этой библиотеке, кроме того, там будет ещё одна драма современного человечества — браузеры и их понимание того, что такое «нажатая кнопка» и как мы сделали работающим paste в браузерах.
    Selectel
    226.65
    ИТ-инфраструктура для бизнеса
    Share post

    Comments 91

      +9
      Браво! Замечательная статья! Читается лучше иной художки!
        +1
        Интересная статья, но маловато технических подробностей конкретно вашей реализации эмулятора терминала(а не пишущих машинок вообще).
          +3
          Будут и подробности.
          +10
          Кстати, название ncurses — библиотеки для рендеринга изображения с использованием esc-кодов, вообще говоря, идёт от английского to curse — высказывать благодарность за удобную и понятную вещь.
          Вот это красиво завернуто :)
            0
            а вот разве 'to curse' не переводится как 'проклинать'?: )
              0
              Ну так в этом-то и цимес :)
                0
                ну так то да: ) «высказать благодарность»
              0
              Очень не хватает вменяемой реализации n-Curses для Windows.
              Всякий раз приходится свое велосипедить.
              +6
              >сражавшийся с бездной легаси, си и longjump'ов в коде
              Примерно так ад программистов я себе и представлял, да.
                +1
                >>Потом, когда писали линукс, …
                >>Тем же путём, кстати, пошёл UNUX и его клоны: solaris, FreeBSD, hp-ux и т.д.

                Вообще-то это линукс пошел по пути UNIX. Вы путатете яйца с курицей =)
                  +1
                  Я не писал это перечисление в хронологическом порядке. Понятно, что юникс немного старше линукса.
                  –1
                  Поправьте эпиграф

                  Если посадить тысячу мартышек на за тысячу пишущих машинок…
                    +2
                    Запятую между ними
                    +2
                    Мой друг когда-то пытался написать терминалку и интересуется, поддерживает ли ваша радость символы занимающие два и более знакомест (CJK иероглифы и прочее)?
                      +2
                      с большой вероятностью нет, т.к. мы юникод поддерживаем в смысле «не режем посредине многобайтного символа». Все операции, связанные с выводом комбинированных или нестандартных по расположению знаков мы просто не делаем, т.к. не разбираемся в содержимом юникода.

                      Если возникнет проблема — сделаем.
                        +4
                        console
                        Речь об этом?
                          0
                          Да.
                          Попробуйте создать несколько файлов именами из «нихонги» и открыть эту директорию в mc.
                          У mc должны поехать рамки.
                            0
                            От иероглифов с большой вероятностью не полезет (консоль использует моноширинные и только моноширинные глифы), а вот от комбинированных символов — да (когда глиф на экране формируется несколькими символами). Но поддержка подобных символов потребует, чтобы библиотека, отрабатывающая команды, знала что-то вообще о том, что за символ ей скормили — а это отдельный сложный мир.
                              0
                              Иероглифы традиционно занимают 2 знакоместа, комбинирующие символы (и всякие null-width space) — 0 знакомест. В любом случае нужно знать ширину символа.
                                0
                                Вообще, одно, насколько я с ними работал. Просто при их использовании остальные шрифты рисуются более крупно или с большими отступами.
                                  0
                                  Тут видно, что 本 ровно в 2 раза шире, чем остальные буквы.
                                  Впрочем, половина старого *curses-софта даже при поддержке терминалом широких символов всё равно неправильно считает ширину.
                              0
                              с какой стати то?
                          –2
                          У меня тоже было желание написать свою терминалку с мышью и спрайтовой анимацией (что-то вроде расширенной псевдографики). Причем хотелось разработать терминальный интерфейс, совместимый с VTxxx на основе UTF-8 кодирования символов.
                          Идея такая: каждый спрайт представляет собой монохромное или цветное изображение (в том числе и анимированное и с поддержкой маски прозрачности для прорисовки нескольких «слоев»), занимающее на экране одно или несколько соседних знакомест.
                          Спрайт в потоке данных кодируется как обычный символ, кодом из UTF-8, и перед первым его использованием загружается его bitmap-образ (который представляет собой hex-последовательность символов, разделенных символом \х08 (BackSpace), для того чтобы, «старые» терминалы, не готовые к такому сценарию не выводили всякий «мусор» на экран).
                          Технически можно продумать вариант использования GIF-формата в качестве способа представления спрайта.
                          Набор загружаемых спрайтов фактически является «цветным растровым шрифтом».
                          Идея загрузки «шрифта» была позаимствована у матричных принтеров Epson.
                          Таким образом спрайты позволят на порядок расширить возможности ASCII-ART'а и псевдографики.
                          О готовности обмена спрайтами (в том числе и о размерах матрицы знакоместа) терминальный сервер и терминальный клиент могут «договориться» с помощью протокола TELNET.
                          Хотелось сделать поддержку работы терминала в полноэкранном графическом режиме.
                          Оставалось только продумать, как кодировать перемещение мыши.
                          Кстати, в старые-добрые времена, некоторые DOS-программы, работавшие полностью в текстовом режиме (например Нортон-утилиты) умели очень хитро делать эмуляцию CGA-курсора мыши в виде стрелки.
                          А, кодирование Unicode, позволило бы использовать и иероглифы в терминалке.
                          0
                          Таким образом, вы РИСУЕТЕ ТЕКСТОВУЮ консоль? А зачем!? Почему не отдавать её ниболее естественным образом — по telnet (ssh) и пустьу пользователя все эти коды обрабатываются хоть в PuTTY хоть в xterm хоть где? Зачем удалённый эмулятор консоли вообще нужен?
                            0
                            Т.е. я не очень понимаю use case — нужно видеть консоль виртуальной машины именно из браузера. Как-то мне кажется, что те, кому надо видеть консоль, обладают более адекватными инструментами для наблюдения консоли вместо этих костылей, paste в браузере и война с пониманием браузером клавиатуры.
                              –1
                              Ну вот я бы не отказался от терминала в JS, задолбали пользователи «а мы не умеем/боимся». Хотя таких JS-библиотек с десяток и все они лучшие и передовые. Меня тут скорее всего напрягло «Си» и «легаси» одном ряду. Это говорит о принципиальном усложнении ситуации и об ООП головного мозга.
                                +1
                                Вот очень даже неплохой терминал на JS
                                  0
                                  Ну вот и я о чём
                                  • UFO just landed and posted this here
                                    0
                                    Эти пользователи и в КОНСОЛЬ не лазают. У тебя, впрочем, пользователям консоль и недоступна, что закономерно.
                                      0
                                      Вот пусть учатся лазать. Как это недоступно? Это ты чего на меня клевещешь? :)) Я как раз известен своей разумной паранойей. Со времён Петерхоста веб-мастеров в консоль гоню.
                                        +1
                                        Щорс, ты меня огорчаешь. Ты тоже путаешь консоль (getty + login — VGA + клавиатура или COM-порт, работает начиная от boot loader'а, а в серверных матерях прямо от BIOS'а, и туда ещё при старте ядра всякое про устройства пишется) и эмуляцию консоли (sshd/telnetd).

                                        В консоль ты пользователей не пускаешь.

                                        И вообще в консоль надо ОЧЕНЬ редко — когда у тебя сервер не грузится из-за косяков в конфигурации ядра или ты в файрволле набагал и тебя не пускают или файловая система не монтируется или при инсталляции sshd забыл разрешить. Короче, пользователям туда не надо, туда надо только руту и в случае дизастера а не для работы.
                                          0
                                          А, это-то. А, я забыл — это же облачники со своими виртаулками. Да, ты прав.
                                  +2
                                  По ssh люди и сами ходить могут. Пока не ломают себе в машине ssh. Собственно, именно для этого консоль и нужна.

                                  Вообще, необходимость делать полноценный эмулятор возникла в основном из-за текстовых редакторов — если нужно поправить файл, то иногда это нужно делать с консоли, а vim, nano и mcedit покрывают, наверное, процентов 95% всех ESC кодов и сложных случаев отрисовки.
                                    0
                                    Если добавить в полноценный эмулятор вменяемую поддержку мыши, то он станет еще полноценнее)
                                      +2
                                      Мы об этом думали, технически там никаких особых проблем нет. Думаю, если в этом будет какая-то реальная потребность, то можно будет доделать. От библиотеки там почти ничего и не требуется-то, в основном вся нагрузка на JS пойдёт.
                                        0
                                        Конечно же есть необходимость!
                                        Большинство современных текстовых редакторов используют мышь!
                                          +1
                                          ИМХО там довольно ограниченное взаимодействие. Ну, во-всяком случае, я в консоли gpm обычно не использую.
                                            –3
                                            Блин, тут речь идет не о личных предпочтениях.
                                            Я ж ведь сам могу свой софт написать, который интенсивно использует мышу и захотеть запустить его в облаке.
                                              +2
                                              Именно в консоли? Текстовой? Ну, там, куда dmesg выводится? Не эмуляции консоли через sshd/telnetd, а в настоящей, аппаратной консоли (которая, конечно, виртуализируется XEN'ом, но это уже детали)? Мне сложно себе представить такой софт. Приведите пример.
                                                +1
                                                поправка, зен не эмулирует консоль, он эмулирует последовательный порт.
                                                  0
                                                  Тем проще!
                                                0
                                                Запускайте, кто ж вам мешает.

                                                JFYI: консоль в зене — последовательный порт. И она может ровно то, что может делать линукс на последовательном порте.
                                          0
                                          Обработка javascript'ом всех трёх кнопок мыши + их же с зажатым shift, и это не считая некоторого усложнения кода терминала. Ради нескольких приложений, прекрасно работающих и без мыши. Зачем?
                                            –2
                                            Дык ведь этот велосипедный терминал как раз и изобретается только для поддержки всего лишь нескольких приложений, прекрасно работающих в том числе и с мышью.
                                            Ведь с этими приложениями можно же и так работать например через то же путти.
                                              0
                                              Не факт, что можно. Терминал в принципе работает без сети на конкретной машине.
                                              В теории можно тупо форвардить/проксировать (чтобы видеть лог выключения) текстовый поток, но я не знаю подводных камней.
                                                +1
                                                Я знаю, мы этот вопрос прорабатывали, но там уж очень мерзко получается с организацией безопасного доступа.

                                                Плюс, там не сохранялся бы вывод до момента подключения.
                                          0
                                          Вы не поняли.
                                          Консоль в ssh. Человек делает «ssh user@consoles.hoster.tld» (обратите внимание — не root@server.of.user.tld), вводит пароль, ему показывают список его [вирутальных] серверов, он выбирает, видит именно КОНСОЛЬ.
                                          Всё что нужно — поставить вместо шелла ему программку, которая будет получать те самые данные которые вы интерпретируете своей библиотекой и отправлять их пользователю как поток байтов.
                                          Зачем браузер, зачем бибилиотека?
                                            0
                                            Думаю, что если бы топикстартер представлял объём работы заранее, он бы так и сделал.
                                              0
                                              Ну вот мне кажется, что это вообще две разные, малосвязаные между собой, задачи — -дать консоль пользователям и сделать эмулятор терминала в браузере. Можно сначала сделать первое малой кровью, а потом уже развелкаться терминалами на Java/JS в свободное время (кстати, терминал в виде апплета и даже, более того, ssh-клиент в виде апплета я видел много лет назад).

                                              Конечно, потом таким терминалом из браузера можно будет подключаться И К КОНСОЛИ тоже, но, в целом эти две задачи никак не связаны и гораздо лучше их решать по отдельности — получается два законченных решения каждое из которых может работать в связке с другими (на консоль можно ходить любым терминалом, терминалом можно ходить на любые хосты) — а так получается вещь в себе за много денег (человекочасов).

                                              Меня удивляет именно постановка задачи — она мне кажется непродуманной, мягко говоря.
                                              +1
                                              Э… истории не будет. Мы этот вариант прорабатывали. Либо нам нужно писать аналог screen (screeen в данном случае не подходит), либо человек остаётся без вывода до момента подключения.
                                                –1
                                                Всё что нужно — писать в файл всё и скармливать файл при подключении, зачем аналог Screen, зачем хранить картинку? Она быстро-быстро отрисуется при подключении.
                                                  +2
                                                  Разорвёте esc-код в середине — побъёте картинку. Потенциально — до состояния нечитаемой.

                                                  Будете сохранять всё — где ж вы эти десятки и сотни мегабайт хранить будете?
                                                    +1
                                                    Сотни мегабайт?! Эмм… Я не знаю, как эти ваши линуксы, а FreeBSD хорошо если пару килобайт в день на консоль выводит. Ну будет МЕГАБАЙТ на клиента — ну подарите вы ему этот мегабайт стораджа, проблем-то, он вам за сотни мегабайт платит.
                                                      +3
                                                      while true;do rmmod ixgbe;modprobe ixgbe;done — и 64к/сек помойки вам обеспечено. (при условии, что у вас не 10Г сетевуха). То же самое может быть от любого модуля ядра.

                                                      Я не говорю, что это все делают, я говорю, «что делать будем, если таковой объявится»? Мы в тестах консоли вполне делали hexdump /dev/random'а.

                                                      Главная разница провайдера и энтрепрайза, что в энтерпрайзе можно сказать «не делайте так», а провайдер должен быть готов к любому поведению.
                                                  +1
                                                  Да, и про историю я ничего не писал, кстати. Когда я подключаюсь к своему физическому серверу по COM-порту в случае если он перестаёт отвечать по сети — у меня нет никакой истории :) Тут ровно та же петрушка. Всё, что вам было нужно — заворачивать виртуальный ком-порт в ssh по требованию (подключению к ssh) — зачем вам была вообще эта эмуляция?

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

                                                  Кстати, был такой ssh-клиент на винде — telneat, в последствие ShellGuard. И вот он умел эмулировать любой терминал по термкапу. Т.е. он читал termcap и настраивал себя по нему — как делает [n]curses с КЛИЕНТСКОЙ стороны (для вывода), только наоборот. Его исходники болтались в сети, на С/C++, очень аккуратно написан был. Более точной эмуляции, например, FreeBSD'шной cons25 я не видел :) А ему было пофигу кого изображать — он одинаково точно делал хоть vt100 хоть xterm хоть cons25 хоть прямо screen, именно ТОЧНО ИЗОБРАЖАЛ а не просто ставил соотв. переменную TERM (в отличие от того же PuTTY — представится может кем угодно, но реально xterm понимает и всё). Но это уже другая история.
                                                    0
                                                    Нам нужно было, чтобы клиенты могли посмотреть на то, что было на консоли до момента подключения. Например, что туда написало ядро.

                                                    А вот читать termcap (и вообще, что-то делать подобное внутри клиентской машины) мы не можем — чужое хозяйство всё-таки.
                                                      +1
                                                      И как вы тогда узнаёте как рисовать? В смысле, в языке какого терминала говорит данная конкретная консоль? :)
                                                        0
                                                        TERM=linux. Мы этого не знаем — мы можем сказать «кто мы», если терминалка попросит, но влиять на TERM клиента мы не можем. По-умолчанию в линуксе тип терминала linux. На это и рассчитано. Если бы могли — писали бы xterm, разумеется, т.к. там фич больше.
                                            0
                                            На будущее, делайте пожалуйста хабракат намного меньше. а то оно у меня даже на одном экране не помещается.
                                              +4
                                              Будете свою разработку выпускать в мир опенсорс?

                                              Или оставите в закромах под лозунгом «наша библиотека — одна из лучших, и уж точно лучшая среди тех, которые не рисуют сразу же на экран» Бе-Бе-Бе

                                              Спасибо, интересное чтиво.
                                                +6
                                                Вы не поверите, но будем. Вот выйду из отпуска, формализмы закончу и будет публичный релиз под свободной лицензией.
                                                0
                                                Както тоже «писал» эмулятор терминала для графического приложения. Дальше корректного отображения «mc» неосилил.
                                                • UFO just landed and posted this here
                                                    0
                                                    Писал на C++, большую часть брал из какойто нето Java, нето C# библиотеки. Это была отладочная/вспомогательная консоль в полноэкранном OpenGL приложении. Ввод в «mc» не заработал и я «забил». Посмотреть нигде нельзя.
                                                  +2
                                                  Любопытный факт насчет клавиши BEEP в телетайпах. Многие наверное получали телеграммы, и видели на них странные буквы: «ЗЦЗЦ». Угадайте, что это было, с одного раза.
                                                    0
                                                    Упс, я имел в виду BELL, конечно же.
                                                      +2
                                                      Мне кажется Вы немного переоцениваете возраст сообщества.
                                                        0
                                                        а что значит в телеграммах НННННН?
                                                          0
                                                          а разве не НННН?
                                                        +1
                                                        > to curse — высказывать благодарность за удобную и понятную вещь.
                                                        а ведь некоторые и не заметят издевку :)
                                                        > браузеры и их понимание того, что такое «нажатая кнопка»
                                                        небось Опера и IE больше всего доставили?
                                                          +6
                                                          (счастливо улыбаясь) Мы с самого начала забили на поддержку IE, так что о проблемах IE мы не имеем ни малейшего представления.

                                                          ЗЫ Причина простая: ни у кого из разработчиков не было под рукой IE, а в силу того, что MS не выпустила дистрибутива для MacOS/Linux, то и взять его было негде.
                                                            –6
                                                            И, купить его вместе с осью было не на что
                                                              +9
                                                              То есть вы хотите сказать, что мы должны были купить IE за 4 с половиной тысячи рублей? Э… только ради того, чтобы реализовать его поддержку? А после этого выкинуть, ибо ничего толвого эта штука не умеет?

                                                              Спасибо, не надо.
                                                          +2
                                                          Консоль — это прекрасно!

                                                          А вообще панель облака будет меняться? Я перешел к вам недавно с Clodo и мне остро не хватает симпатичных графиков в реальном времени, и других красивостей.
                                                          Ну и писем на почту, сколько денег ушло за вчера, тоже не хватает.
                                                            +5
                                                            будет, работаем. Текущая стагнация в развитии веб-морды — причина того, что делается другая морда.
                                                            –5
                                                            Жаль что в этой интересной статье основной упор делается на Unix/Linux-терминалы.
                                                            Дело в том, что в Windows тоже есть совсем даже неплохой терминальный интерфейс VTNT.
                                                            Причем символы изначально кодируются в нем в UNICODE (это к вопросу о поддержки иероглифов).
                                                            Кстати на сайте MSDN есть очень подробная документация про него.
                                                            Формат обмена гораздо проще и прозрачнее чем у никсовых терминалок.
                                                            И, так же поддерживается более широкий диапазон сочетаний клавиш.
                                                            В этом интерфейсе (в его стандартной реализации) есть парочка недостатков:
                                                            1) гораздо больший объем сетевого трафика, создаваемый как нажатием кнопки, так и отображением символа (что не слишком критично для локального применения, а так же может быть решено компрессией передаваемого трафика).
                                                            2) отсутствие встроенной поддержки мыши (впрочем как и у остальных VTxxx терминалов).
                                                              –2
                                                              Кстати в Microsoft, в реализации своего VTNT изначально решили эмулировать не печатающую машинку, и даже не телетайп, а, сразу — компьютерную консоль (совместимую с Win-API).
                                                              Это обстоятельство очень выгодно отличает VTNT от других VTxxx.
                                                                +2
                                                                В статье описывается решение вполне реальной задачи. А зачем нужна очередная реализация VTNT — не преставляю.
                                                                  –6
                                                                  На сколько я понимаю, описываемый в статье эмулятор терминала будет запускаться как в никсах так и в виндах.
                                                                  Я считаю логичнее было бы добавить пользователю облака самому выбрать терминальный клиент (например путти).
                                                                  Если б я был пользователем этого облака, то захотел бы использовать программу telnet.exe, встроенную в коробку с виндой.
                                                                  из предлагаемых типов терминалов (ansi, vt100, vt52 и vtnt) разумеется отдал бы предпочтение именно vtnt.

                                                                  П.С.: Почему именно я предпочел бы встроенную, проверенную временем, надежную фирменную реализацию клиентского терминала новомодному велосипеду — риторический вопрос.
                                                                    +7
                                                                    Удачи работы в телнете по публичным wifi-сетям.
                                                                      –4
                                                                      Я думаю, что не нужно лишний раз напоминать о возможности использования всяких защищенных туннелей, которые как раз и предназначены для того чтобы смело запускать телнеты (впрочем так же как и попы и эсмтэпы) в публичных вайфай (и эзернет) сетях.
                                                                        +7
                                                                        Ну да, типичный MS-way. Вместо SSL городить туннели, главное ни в коем случае не использовать нормальный ssh (который ещё много чего умеет, чем просто кнопочки передавать), а тащить античный и глючный telnet.

                                                                        Вы меня пытаетесь убедить, что нужно реализовать совместимость с MS, а я вот не вижу никаких коммерческих преимуществ в поддержке этой рухляди.
                                                                          –6
                                                                          Вообще мне хочется облако с возможностью запускать в нем виндовые проги (а, конкретно, Far-Manager с его кучей плагинов)
                                                                          Как в облаке будет реализована подсистема запуска виндовых приложений (через эмулятор или виртуальную машину) меня как пользователя не должно сильно волновать (найти подходящее облако — всего лишь дело времени).
                                                                          Меня больше интересует именно форма взаимодействия с виндовыми приложениями.
                                                                          Виндовые приложения в подавляющем большинстве используют мышу!
                                                                          Встроенный в винду телнет мышу не поддерживает.
                                                                          Я ожидаю от разработчиков велосипедных терминалов вменяемой поддержки мыши.
                                                                          Пусть эта поддержка будет через специальное приложение-эмулятор, с этим я готов смириться.
                                                                          Но, блин, оставьте мне совместимость Win-API (в образе VTNT), для возможности замены велосипедного клиента своим собственным клиентом, способным эмулировать эмулятор терминала с поддержкой мыши.
                                                                          пусть даже на другом конце облака будет и не виндовое приложение, а никсовое, но с мышою.
                                                                          мой телнет с блек-джеком и мышами должен продолжать работать как ни в чем ни бывало.
                                                                            +2
                                                                            пусть даже на другом конце облака будет и не виндовое приложение, а никсовое, но с мышою.
                                                                            Ты хочешь работать с никсовым приложением в VTNT? Удачи.
                                                                              +8
                                                                              Извините, у нас есть услуга «VDS'ы на hyper-v», там вам майкрософт три раза сделает приятно.

                                                                              А с оплатой по потреблению винды не будет по простой причине: майкрософт хочет денег за лицензию. А я не хочу херить красивую модель оплаты ресурсов по потреблению какими-то дурацкими лицензионными отчислениями, которые стоимость вхождения в услугу увеличат раз так в 5-7.
                                                                +2
                                                                Ага, я тоже когда то открыл эту банку с червями, когда хотел написать эмулятор терминала на JS. Посмотрел, написал только самое необходимое и закрыл в ужасе.
                                                                  0
                                                                  2 месяца сложной технической работы… прямо подвиг! Оно того реально стоило? Более важных проблем и задач у селектела сейчас нет? :)

                                                                  Спрашиваю, потому как слежу за развитием и хочу попробовать это облако после неудачной попытки с Clodo. Всё в принципе привлекает, кроме грустных замечаний некоторых знакомых бизнесменов из серии «я за несколько лет по российским хостерам столько бегал, что теперь только Европа! Было бы круто увидеть пост на эту тему — о сравнении наших и „ихних“ облачных хостингов в плане не только цен, но и отказоустойчивости/качества/саппорта.
                                                                    +4
                                                                    Никто не ожидал, что это будет так долго. А консоль нам нужна была, потому что без этого дальнейшее развитие инфраструктуры невозможно (многие операции с машинами потребуют netless доступа к машине).
                                                                    0
                                                                    >это андроидный смартбук.
                                                                    Toshiba AC100?
                                                                      +1
                                                                      Она самая. Браузеры (все) под андроид более отвратительны, чем ожно было бы ожидать. Дурацкая покупка. Сначала я думал «ну, это с непривычки», а потом я взял с собой в отпуск только её — и понял, что так жить нельзя. Финал я писал с помощью vim'а в connectbot'е по ssh на свой сотовый (!) телефон (n900).

                                                                    Only users with full accounts can post comments. Log in, please.