Сервант с кукушкой и нечеловеческим голосом

Чтобы понимать о чем идет речь, вам нужно сначала посмотреть сюда:

https://zhevak.wordpress.com/2012/01/11/сервант-с-кукушкой/

В преддверии Хэллоуина было бы не дурственно создать из своего компа мега-часы.

Лоток CD/DVD привода заменит нам кукушку, как это и было сделано у нас (см. статью по ссылке). А вот звук «ку-ку» давайте немного очеловечим.

Для этого нам понадобится пакет espaek. У меня все еще работает Ubuntu 10.04 и этот пакет уже установлен по умолчанию. Если у вас по какой-либо причине он не установлен, то его нужно установить. Я не хотел бы в уже который раз описывать, как это сделать. Я думаю, вы это уже знаете , ну, или на крайняк, сообразите почитать мои предыдущие статьи.

Итак, давайте установим минимальную громкость в звуковых колонках и введем команду:

$ espeak "hello"

Ну что, оправились от шока? Отлично! Усложним задачу:

$ espeak "hello my dear friend $USER"

Получится классно, если имя пользователя у вас очеловеченное, а не концлагерный номер. Например, у меня имя «alex», поэтому комп обращается ко мне по нормальному человеческому имени.

Все программы работают не вообще где-то в космосе, а в конкретной среде. Для работы программ среда предоставляет так называемое — окружение. Окружение состоит из переменных и их значений. Некоторые переменные не имеют значений. Просто, в окружении имеется (определено) имя переменной, но значений как такового у нее нет.

Вот несколько примеров переменных (из типового окружения программ):

USER=alex
HOME=/home/alex
PATH=/opt/arm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
PWD=/home/alex/work
TERM=xterm

Это не команды! Вводить их в консоли не надо! Это просто гипотетический список переменных и их значений.

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

Далее, мы видим, что имя переменной и ее значение разделяются с помощью знака равенства «=».

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

Все переменные имеют строковый тип.

Иначе говоря, даже если переменная имеет значение 12345 или 3.14 и выглядит как число, то все равно это — строка символов.

MY_VAR_1=12345
MY_VAR_2=3.14
TWO=2
THREE=3

Соответственно если мы сложим переменные TWO и THREE, то мы получим в результате строку «23» или даже строку «2+3», а не число 5.

Создать переменную чрезвычайно легко, достаточно написать в консоли что-то типа:

$ TWO=2

После этого в окружении появилась переменная TWO со значением «2».

Теперь можно посмотреть на ее значение:

$ echo $TWO
$ 2

Обратите внимание на знак доллара перед именем переменной. Это обязательный конструктивный элемент. Не забывайте про него!

Помните, мы использовали для «говорилки» переменную $USER? Давайте узнаем ее значение. На моем компе это выглядит так:

$ echo $USER
$ alex

Вообще переменных в окружении много, у меня в данный момент их 35 штук. Вы можете вывести с помощью команды:

$ printenv

Не трудитесь подсчитывать количество строк на экране, чтобы определить количество переменных. Позвольте это сделать оболочке:

$ printenv | wc -l

Здесь мы перенаправили вывод команды printenv через безымянный канал (пайп, pipe) на вход команды wc.

Работа команда wc заключается в подсчете количества строк, слов и букв во входном потоке, и выводе этих чисел на экран. Но нас не интересует ни количество слов, ни количество букв, — только количество строк. Поэтому мы задали параметр -l (прописная английская буква L, а не цифра один).

Я еще на пару минут отвлекусь от основного тренда статьи. Сейчас вам наверняка не понятно назначение этих переменных, зачем их только вообще придумали!

Не торопите события! Не сейчас, но через некоторое время работы в Линуксе вы поймете этот механизм управления и взаимодействия между программами. А сейчас просто воспримите его как факт.

Итак, мы знаем, что все переменные имею строковый тип. Но по жизни очень много приходится работать с числами. Для того чтобы с переменной работать как с числом, разумеется, мы должны преобразовать ее строковое значение в число.

Сделать это можно несколькими способами.

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

$ echo $TWO + $TWO
$ 2 + 2
$ echo $((TWO + TWO))
$ 4

«Конечно, — скажете вы, — каждый раз преобразовывать значение переменной из строковой в число, выполнять какие-то арифметические действия, а затем превращать полученный результат (число) снова в стоку — это вообще какое-то корявое решение!»

Не спешите делать выводы! Дело в том, что в Линуксе — всё есть файл. Причем, желательно, текстовый файл. Почему текстовый? — Да потому, что с текстом намного удобнее работать, хоть и возникают порой необходимости преобразования текста в числа.

Удобнее работать потому, что текст, он и в Африке текст! Вы можете текст свободно записать в файл, потом этот файл отредактировать так, как вам взбредет в голову. Вы можете заняться поиском в этом файле. Вы можете произвести поиск-замену. Вы можете отправить этот файл по сети и быть уверенным, что его смогут прочитать люди. Вы можете отправить этот файл на принтер. Вы можете как угодно крутить-вертеть текст, и все вам сойдет с рук, потому-что что бы вы ни делали, вы будете получать текстовый результат, который всегда можно посмотреть любым текстовым редактором или вьювером. Вам не нужны будут какие-либо изощренные конверторы и интерпретаторы кодов.

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

А средства (команд) для обработки текста в Линуксе — умотаться! Причем, это — базовые средства. Вы их изучаете только один раз и применяете во всех своих дальнейших работах.

Например, вы уже знаете команду wc. Вы наверняка знакомы с командой grep. Вы так же знаете команды echo и cat. Многие из вас уже применяли команды tr, sedcut, paste, sort, uniq, tee и другие. Причем, вам не нужно знать сразу их все. Вы можете их осваивать по мере необходимости. Собственно, так и происходит на практике.

Каждая команда выполняет только свою маленькую задачу, и делает это максимально надежно и качественно. Благодаря принципам заложенным в Линукс, мы можем результат одной команды (то есть ее выход) можно направить на вход второй. Таким образом, используя качественные кирпичи (команды) и качественный клей (средства передачи информационных потоков), можно создавать сколь угодно величественные здания (программы, скрипты).

Кипричи — вот! Раствор — там! Используйте свою голову — стройте свой дворец сами! Я уверен, если у вас с головой всё в порядке, то никакие Майкрософты вам уже будут не нужны. Продавцам выгодно пудрить мозги своим пользователям, вбивать мысль, что все очень сложно и пользователь не должен строить сам, а должен покупать готовое. Многие юзверы безапелляционно приняли эту идею и всем сердцем уверовали в неё.

Ладно. Давайте лучше еще поиграемся с «говорилкой», чем понапрасну пинать зомбированных граждан.

У вас в вашем домашнем директории имеется файл .profile . Имя файла начинается с точки, поэтому он невидимый.

— Ты суслика видишь? А он есть! (с)

Этот файл выполняется всякий раз, когда вы входите в систему под своим аккаунтом. Давайте добавим в самый конец этого файла строку, которая будет приветствовать нас.

У нас нет необходимости специально запускать текстовый редактор, потом загружать в него файл, прокручивать его вниз до конца, потом дописывать строку, сохранять, выходить…

Мы можем сделать это все одной командой:

$ echo 'espeak -v ru -s 90 "Приветствую тебя, о-о мой повелитель $USER"' >> ~/.profile

Команда echo обычно передает текстовую строку (все, что заключено в кавычки и находится справа от нее) на стандартный выход. Но мы помощью оператора >> перенаправим этот поток в файл ~/.profile .

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

Если бы мы указали просто имя файла .profile, то система бы попыталась найти (а при отсутствии — создать) этот файл в том месте, где мы дали команду. То есть, если бы мы находились в каком-нибудь директории, но не в корне своего домашнего, то команды была бы выполнена не правильно. Но мы указали перед именем файл символы ~/, которые означают корень нашего домашнего директория. Это есть тоже самое, что и $HOME. В принципе можно написать и так (~/.profile) и так ($HOME/.profile) — результат будет один и тот же.

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

Внутри кавычек (в команде echo) имеются апострофы. Собственно апострофы и кавычки в Линуксе, можно считать, что равнозначны. Мы можем в кавычки помещать апострофы, и можем апострофы помещать в кавычки.

Нам нужно в файл .profile поместить строку:

espeak -v ru -s 90 "Приветствую тебя, о-о мой повелитель $USER"

В этой строке указана команда, которая будет выполняться — espeak. У этой команды две опции и один аргумент.

Опция -v ru говорит, что нужно использовать русский словарь вместо английского, который подключается по умолчанию.

Опция -s 90 определяет скорость произношения.

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

Теперь вы понимаете, что мы сделали одной командой. Ну что, настало время испытать «монстра» — давайте завершим наш сеанс работы и снова зайдем в систему. То есть перезагружать комп по-вендовому совсем необязательно!

Если вы все сделали правильно, вы услышите приветствие с ужасным произношением.

Давайте теперь переключимся на чистую консоль. Нажмите Ctrl-Alt-1, введите название аккаунта и пароль. И, не смотря на то, что перед нами символьная консоль, комп снова награждает нас приветствующим выражением. Выход из консоли — по Ctrl-D.

Ну а теперь, возвращайтесь к статье «Сервант с кукушкой» и попробуйте самостоятельно доработать скрипт. Учтите, что «говорилка» также способно произносить числа.

Advertisements

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s