l3text
Материал из Xgu.ru
l3text (или l3) — это программа, которая предоставляет интерфейс
к информации, записанной LiLaLo, прямо в командной строке.
Результаты распознавания записываются с помощью l3-agent в базу данных SQLite, и они становятся сразу же доступными для использования с помощью l3text.
l3text — это набор инструментов, для работы с транскриптами сеансов, сгруппированные под одной крышей.
Содержание |
[править] В процессе разработки!
На этой странице представлена информация о программе, которая находится в процессе разработки. Текущая (клиент-серверная) версия LiLaLo не имеет описанных здесь возможностей. Они будут доступны в следующей версии (0.3), когда она будет готова. Если вы хотите начать использовать описываемые возможности уже сейчас, берите код из репозитория lilalo, из ветки lilalo-sqlite. hg clone http://xgu.ru/hg/lilalo hg update lilalo-sqlite |
[править] Некоторые примеры использования
Показать весь журнал команд в текущем контексте (начиная с текущего положения).
$ l3text cat
Показать только командные строки или только вывод:
$ l3text cat -c $ l3text cat -o
Показать последние 10 команд:
$ l3text tail
Показать последние 20 команд:
$ l3text tail -20
Следить за текущим сеансом, то есть показывать все команды, выполняющиеся в текущем контексте:
$ l3text tail -f
По умолчанию показываются только команды и результаты их выполнения. Вывод можно настроить:
$ l3 cat -o time,cline,output
[править] Контекст
Все команды, которые вы набираете, и результаты их выполнения не повисают в воздухе, а дописываются в конец листов, находящихся в определённых местах.
Лист, на который попадают команды называется контекстом записи.
Вы можете набирать команды в разных окнах, но если они находятся в одном контексте, то они запишутся на один лист, одна под другой.
С другой стороны, в одном окне вы можете поменять контекст несколько раз, и команды, набиравшиеся в этих контекстах, попадут на разные листы.
По умолчанию контекст равен /default , но для удобства дальнейшей работы с записями рекомендуется задавать нужный контекст, которому соответствуют выполняемые действия.
Сменить текущий контекст записи можно так:
l3 context /path/to/new/context
Просмотреть контекст записи можно так:
l3 context
Итак, контекст записи (контекст агента) определяет, куда попадают команды при записи.
Мы записывали команды не просто так. Мы хотим поработать с тем, что мы записали. Лист, на котором записаны команды, с которыми мы хотим поработать, определяется контекстом чтения.
То есть он определяет, какие именно команды из записанных ранее мы имеем в виду.
По умолчанию текущий контекст чтения становится равным текущему контексту записи.
Смена текущего контекста чтения:
$ l3 cd /path/to/new/context
или
$ l3 go /path/to/new/context
Просмотр доступных контекстов:
$ l3 ls
Просмотреть имя текущего контекста чтения:
$ l3 pwd
Символы : и / являются в имени контекста специальными.
Символ / формирует иерархию контекстов, а символ : указывает координаты строки в контексте.
Перейти на 3 команды назад:
$ l3 go :-3
Перейти в контекст /adm/lab1, в его самый конец (и находиться всё время в конце, если он растёт, то есть делаются новые записи):
$ l3 go /adm/lab1
Перейти в контекст /adm/lab1, на первую команду grep:
$ l3 go /adm/lab1:/grep/
О том, как указывать координаты интересующих нас строк, написано ниже, в разделе «Интервалы».
[править] Команда
l3 [ОПЦИИ1] [ИНТЕРВАЛ] [filter ВЫРАЖЕНИЕ] [grep РЕГВЫР] [КОМАНДА] [ОПЦИИ2]
[править] Интервалы
По умолчанию операция выполняется над всеми командами, находящимися в текущем контексте, начиная с текущей точки и до его конца.
Можно ограничить команды с помощью интервала:
выражение выражение,выражение
Примеры:
-10,. последние 10 команд .,+3 от текущей команды три вниз /grep/ последняя команда grep o/grep/ последняя команда, содержащая grep в выводе (output) . текущая строка @12:23 команда, выполненная в 12:23 (12:23 текущего часа) @08:12:00 команда, выполненная в 8:12:00 (или ближайшая после этого времени) 1 первая команда в контексте $ последняя команда в контексте % весь контекст
Интервал указывается перед командой, работу которой он ограничивает:
l3 -10,. cat
напечатать последние 10 команд
равносильно этому:
l3 tail -10
интервал = строка интервал = строка,строка интервал = % строка = число
= -число = +число = @время = /регвыр/ = . = $
[править] Фильтрация
Можно указать дополнительный фильтр, который оставляет команды, которые нас интересуют.
Есть два вида фильтров:
* по регулярным выражениям * по вычисляемому выражению (синтаксис perl с некоторыми отличиями)
grep -v regexp инверсия grep regexp прямой поиск
-f полный -o только в выводе -c только в команде (по умолчанию)
filter выражение
[править] Команды
- cat
- tail
- head
- history
Все эти команды являются сокращением для одной команды.
[править] Зачем всё это нужно
Самые простые примеры:
- использование данных вывода команд при автоматическом продолжении команд
- быстрое выделение и копирование команд и результатов их выполнения
- поиск команд (не по одной истории одного интерпретатора, а по всем историям всех сеансов, как по команде, так и по её выводу!)
- привязка ко времени (выстраивание всех действий вокруг временной оси команд: что было у меня с системой, когда я давал эту команду?; подумайте об этом в сочетании с системами виртуализации и созданием снимков дисков!)
- подключение к журналу (плоды выполнения операций в одной системе можно загрузить в другую систему: получить историю всех команд и правки всех файлов, как будто вы сами всё это делали! причём, что самое удивительное, с поправкой на текущую систему)
Это только примеры. Вообще, вы можете делать всё, что хотите, с командами, которые вы когда-либо давали в вашей системе, и результатами их выполнения.
Они становятся доступными по одной команде.
[править] Tab-completion: Данные вывода команд при наборе других команд
Вы выполнили одну команду, и хотите использовать результаты её исполнения в качестве аргумента другой.
Например, вы просканировали wifi-сети:
# iwlist scanning
В выводе команды присутствовали названия SSID, один из которых мы будем использовать дальше. Было бы классно, если бы дальше, когда мы вводим команду
# iwconfig wlan0 essid ____
мы могли использовать табуляцию при наборе essid.
В качестве списка возможных продолжений должны использоваться сети, которые выдала предыдущая команда.
Это становится возможным с использованием l3text (при написании соответствующих расширения для bash_completion).
[править] Быстрое выделение и копирование команд
Ваш друг помогает вам настроить систему по джабберу. Он присылает вам команды, которые вы творчески перерабатываете и вводите в консоль.
Потом, для того чтобы он видел, что получается, вы копируете результаты исполнения ему в джаббер.
Например, вы хотите показать результат пяти последних команд:
В самом простейшем случае (если вы используете графический джаббер-клиент)
l3 tail -5 | xsel
Потом идёте в джаббер-клиент и делаете:
shift-insert
Можно отправить ему код прямо из консоли:
l3 tail -5 | sendxmpp igor@chub.in
Или даже ещё проще, всё, что вы делаете будет копироваться ему:
l3 tail -f | sendxmpp igor@chub.in
Или, если вы не хотите, чтобы копировались команды, набранные неверно:
l3 filter err!=128 tail -f | sendxmpp igor@chub.in
Команды l3 не обязательно вызывать в той сессии, где идёт настройка.
Вы можете их вызывать в соседнем терминале, где вообще не идёт запись.
Конечно, вы должны будете указать соответствующий контекст.
l3 cd /adm/lab1
(предполагается, что настройка идёт в /adm/lab1 )
[править] Поиск команд
Вы выполняете настройку сервера, в ходе которой сделали много инсталляций пакетов.
Вы делали их в разных окнах, уже сами не помните в каких, но запись всё время шла.
Вы хотите увидеть имена пакетов, которые были установлены.
Простейший вариант:
l3 grep apt-get
Если вы помните, что начали работу по инсталляции после обеда, а всё, что было до этого, к делу не относится:
l3 @14:00:00,$ grep apt-get
Если вы помните, что было много инсталляций, но в некоторых из них вы неправильно указывали имена пакетов, и вы хотели бы оставить только те из них, которые выполнились успешно:
l3 grep err=0 grep apt-get
или
l3 filter err=0&&/apt-get/
или
l3 filter err=0 grep apt-get
[править] Привязка ко времени
Вы рассказываете, как настроить какую-то вещь. Вы хотели бы, чтобы всё, что вы рассказываете, можно было использовать как основу для составления более подробного документа.
Вы используете доску (или графический планшет), некоторые вещи делаются не в командной строке, а на экране с графическим интерфейсом, кроме того ваш голос записывается.
Вы не можете тратить время на то, чтобы положить скриншоты в нужное место, но вы можете их сделать. Аналогично и со скринкастами. Вы можете записывать то, что вы делаете при подключении к какой-то системе, но вы не можете выполнять никаких других операций по обработке записи. Потому что на это просто нет времени.
Ход вашей работы фиксируется, операции запоминаются, скриншоты помечаются временными метками. Аналогично происходит со схемами на доске, которые фотографируются и представляются в виде помеченных временными метками файлов.
После того, как сеанс окончен, вы получаете его транскрипт, который можно дальше редактировать. Команды в этом транскрипте сопровождаются специальными якорями, с помощью которых они привязываются к записанному ранее сеансу.
В транскрипте вы удаляете лишние команды, добавляете текст и получаете документ, который подробно описывает происходившее, причём при желании вы можете получить недостающую информацию из архива сделанных ранее операций.
Туда же, в нужные (соответствующие времени) места, автоматически попадают сделанные скриншоты, скринкасты, фотографии, запись звука.
[править] Подключение к журналу
Продолжим предыдущий пример.
Вы прочитали документацию, составленную по описанной выше методике, и теперь хотите выполнить такую же настройку.
В обычном случае вы просто копируете команды в свою командную строку или набираете их заново, с учётом ваших собственных условий.
Можно значительно ускорить и упростить этот процесс, а так же уменьшить вероятность ошибки возможной в ходе его выполнения.
Вы подключаетесь к сделанной записи:
l3 go http://xgu.ru/l3/option-82
Все рассмотренные ранее команды становятся доступным.
Становится доступным продолжение команд (tab completion) на основе информации, набранной в той работе и даже больше: вы можете добавить команды из контекста в историю текущего командного интерпретатора, как будто вы их сами уже выполняли.
Автоматически они не добавляются, чтобы не создавать путаницы. Но вы можете их загрузить:
l3 % | l3hist
или, если вас интересуют только определённые команды, то с использование интервала, например:
l3 @14:00,$ | l3hist
Вам тогда не нужно будет их заново набирать. Достаточно прокрутить историю вверх, а потом просто выполнять по одной, нажимая ctrl-o, при этом адаптируя к своим условиям.
Чтобы ещё сильнее сократить себе объём работы, можно применить процедуру адаптации, которая позволяет автоматически заменять специфические для процедуры параметры.
Для этого вы вызываете:
l3 parameterize l3 param (сокращённо)
которая открывает текстовый редактор, где указывается два столбика параметров: что заменить и на что заменить.
Например, пусть в описанном документе используются адреса:
192.168.15.1 192.168.15.254 example.com
Причём составитель этого документа мог указать, что эти параметры являются специфичными, а мог не указывать. Если он указал, то совсем хорошо — тогда вам нужно просто пройтись и добавить справа, на что они должны заменяться в вашем случае. Если же он не указал, то вам нужно придумать список замен по своему вкусу.
Вы вводите локализованную версию:
192.168.15.1 10.0.35.1 192.168.15.254 10.0.35.254 example.com xgu.ru
Теперь, во всех выводах команды l3 будут исправленные команды и исправленные результаты их выполнения. Автопродолжение (tab completion) в шелле уже будет показывать исправленные аргументы. Историю командного интерпретатора вы тоже можете обновить, и в ней тогда будут изменённые команды.
Использовать параметризацию с загрузкой удалённого контекста настолько логично, что вы можете это сделать одной командой:
l3 go -p http://xgu.ru/l3/option-82
[править] LiLaLo на Xgu.ru
- LiLaLo
- Инсталляция LiLaLo
- Использование LiLaLo
- Устройство LiLaLo
- LiLaLo TODO
- Компоненты: l3-agent | l3-frontend | l3-backend | l3script | l3text