kallypigos: (Chinese)

Пришло в голову, что довольно дурацкое слово «пост-ПК» может быть вполне осмысленным в школьной информатике.

В предмете «Основы информатики и вычислительной техники» самым проблемным всегда был союз «и».

Именно изменение выражаемого им смысла можно положить в основу периодизации нашей злополучной дисциплины:

1) Период «бескомпьютерной информатики» (1980-е). Полная гармония. Про информатику рассказывают и про ВТ тоже рассказывают.

2) Период конкуренции (1990-е). При информатику рассказывают, а ВТ показывают. ВТ (школьная) разнообразна, и по крайней мере учитель имеет «внеклассный» опыт такого разнообразия.

3) Период ПК (2000-е). Полный раздрай. Рассказывают про информатику, но внеклассный опыт ВТ имеет лишь рекламное, а не деятельное содержание; собственно и в учебный материал струится реклама. Причем это относится как к рекламе «Майкрософта», так и к внедрению СПО, которое свелось к рекламе «Линукс». (М. Е. не то писал, не то рассказывал, анекдот: когда он перетирал в начале 2000-х с какой-то из учебниковых мафий, в ответ на замечание о том, что учебник наполовину наполнен рекламой «Майкрософта», получил вполне резонный вопрос: «А что надо рекламировать?».) Школьная ВТ — почти сплошь IBM PC. Нулевые они и есть нулевые, что с них возьмешь.

4) Период пост-ПК (2010-е). А вот тут интересно. Опыт разнообразия ВТ появляется уже во внеклассной и доклассной действительности учеников, просто в быту.

Пост-ПК это прежде всего не смартфоны и планшеты, а мобильные проигрыватели, «обычные» сотовые телефоны и приставки, наверное. Где-то с конца 1990-х я сталкиваюсь с вопросами типа: «А почему программа с телефона не работает на проигрывателе?», «Почему здесь я могу слушать/смотреть форматы А, Б, В, а здесь Б, В, Г?», «Почему к проигрывателю я могу подцепить „флешку“, а к телефону не могу?» и т. п. Ну да, сейчас уже и планшеты со смартфонами.

Вот есть бытовой материал, который можно использовать для того, чтобы рассказывать именно о ВТ, а не только об информатике. Плюс в том, что он есть. Минус в том, что он тоже изначально маркетологизирован, и его еще нужно как-то рационализировать. Мы примерно в положении учителей из ЦПШ столетней давности, которые вроде как могли апеллировать к опыту наблюдения учениками грозы, но должны были как-то продраться сквозь Илью-пророка, рассекающего по небу на колеснице.

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

kallypigos: (hybrid)

  1. Кто командует парадом?
    Перейдем теперь к главной гордости интерпретаторов Unix - комбинированию команд.

    Виктор Хименко Комбинирование командПерейдем теперь к главной гордости интерпретаторов Unix комбинированию команд. Вначале рассмотрим его простейшие варианты.Как уже говорилось, из одной командной строки в bash можно запустить несколько программ ...

    .../pcworld/2001/02/156147/

  2. Кто командует парадом?
    В этой статье речь пойдет о традиционном для UNIX-систем интерфейсе командной строки и о языке наиболее популярного в Linux командного интерпретатора bash.

    Виктор Хименко В двух предыдущих статьях* мы рассмотрели файловую систему и управление процессами в ОС Linux. На все это мы глядели со стороны ядра: строго говоря, термин Linux и относится к ядру, а ОС в целом правильнее именовать GNU/Linux, ...

    .../pcworld/2001/01/155984/

  3. Процессы, задачи, потоки и нити
    Рассказ о жизни процессов естественно начать с самого начала - с их появления на свет.

    Виктор Хименко Процессы в системеРассказ о жизни процессов естественно начать с самого начала с их появления на свет. ... и вообще о том, как из отдельных процессов и файлов складывается нечто единое. ОБ АВТОРЕ Виктор Хименко, e-mail: khim@mccme.ru

    .../pcworld/2000/06/155122/

  4. Процессы, задачи, потоки и нити
    Начнем с простого вопроса: сколько понятий Linux фигурирует в заголовке статьи? Как ни удивительно, разные знатоки системы вполне могут назвать в ответ разные числа в диапазоне от одного до трех.

    Виктор Хименко Начнем с простого вопроса: сколько понятий Linux фигурирует в заголовке статьи? Как ни ... значение PID, что и текущая).Окончание в следующем номере.ОБ АВТОРЕВиктор Хименко, e-mail: khim@mccme.ru Тестовая программа#include int main(int ...

    .../pcworld/2000/05/154995/

  5. Файлы, файлы, файлы
    Теперь, когда мы выяснили, какие объекты встречаются в файловой системе, полезно вспомнить, что Linux, подобно другим Unix-системам, является многопользовательской ОС, а значит, доступ к файлам должен ограничиваться: вряд ли вы будете в ...

    Виктор Хименко Права доступаТеперь, когда мы выяснили, какие объекты встречаются в файловой системе, полезно ... мы рассмотрим позже, когда перейдем к работе Linux в сети.Об автореВиктор Хименко, e-mail: khim@sch57.msk.ruОкончание. Начало см. в Мире ПК ...

    .../pcworld/2000/03/154782/

  6. Файлы, файлы, файлы
    Человеку, ранее работавшему с DOS или Windows, при общении с Linux прежде всего бросаются в глаза использование символа `/? вместо ??, отсутствие имен дисков (A:, B:, C: и т. д.) и то, что в именах файлов различаются большие и маленькие буквы.

    Виктор Хименко Человеку, ранее работавшему с DOS или Windows, при общении с Linux прежде всего бросаются в глаза использование символа `/? вместо ??, отсутствие имен дисков (A:, B:, C: и т. д.) и то, что в именах файлов различаются большие и ...

    .../pcworld/2000/02/154661/

kallypigos: (hybrid)

Комбинирование команд

Перейдем теперь к главной гордости интерпретаторов Unix — комбинированию команд. Вначале рассмотрим его простейшие варианты.

Как уже говорилось, из одной командной строки в bash можно запустить несколько программ последовательно, записав соответствующие команды через точку с запятой (?;?), или параллельно, разделив их амперсандами (?&?). Имеется, конечно, и так называемая «труба» (pipe), перенаправляющая стандартный выход одной программы на стандартный вход другой. Из Unix она перекочевала и в DOS, но там, впрочем, реализована «халтурно»: даже при использовании интерпретатора DOS 7.x из командной оболочки Windows 9X, где ядро ОС имеет все необходимые средства, первая команда полностью отрабатывает перед началом выполнения второй, а данные передаются через временный файл.

Для управления порядком запуска программ, очевидно, необходимы операторные скобки. И в bash они действительно есть, причем даже двух видов — фигурные и круглые. Фигурные просто разделяют команды и показывают приоритеты, а круглые полностью изолируют выполняемые операции от «внешнего мира»: так, если внутри них меняются значения переменных окружения, на последующие команды это не влияет (см. рис. 1).

[khim@localhost khim]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/opt/bin:/home/khim/bin

[khim@localhost khim]$ ( PATH=/bin ; echo $PATH )
/bin

[khim@localhost khim]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/opt/bin:/home/khim/bin

[khim@localhost khim]$ ( PATH=/bin ; echo $PATH ;)
/bin

[khim@localhost khim]$ echo $PATH
/bin
[khim@localhost khim]$

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

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

[khim@localhost khim]$ export LC_ALL=english
[khim@localhost khim]$ date
Fri Aug 18 19:51:24 MSD 2000

[khim@localhost khim]$ LC_ALL="`( . /etc/sysconfig/i18n ; echo \"$LOCALE\";)`" date
Птн Авг 18 19:55:17 MSD 2000

[khim@localhost khim]$ echo $LOCALE

[khim@localhost khim]$

Рис. 2. Можно вставить одну команду в другую

Взгляните на рис. 2. Здесь мы сначала заносим в переменную окружения LC_ALL, определяющую параметры страны, значение english, а затем выводим дату на языке страны, указанной в файле /etc/sysconfig/i18n (там задаются стандартные настройки системы). Чтобы это сделать, мы записываем в LC_ALL новое значение. Какое же?

Давайте разберемся по порядку. Внутри кавычек (они, как обычно, поставлены на тот случай, если в значении, присваиваемом переменной LC_ALL, окажется пробел; в действительности это невозможно, но, как говорится, кашу маслом не испортишь) мы видим в обратных апострофах команду с именем ?.? и одним параметром /etc/sysconfig/i18n. Что она делает? Выполняет строки файла, указанного в качестве параметра, так, как если бы они были введены в этом месте в «натуральном виде». В частности, если в файле определяются переменные (а файл /etc/sysconfig/i18n содержит только определение переменных и комментарии), то они становятся доступны. Одну из них — LOCALE — мы выводим следующей командой, и она подставляется в командную строку в качестве значения, присваемого переменной LC_ALL.

Вместо обратных апострофов можно было использовать и конструкцию $(...). А очень похожая на нее конструкция $((...)) позволяет подставить в командную строку значение арифметического выражения (см. рис. 3; команда date с параметром +%s выдает текущую дату и время как число секунд, прошедших с 1 января 1970 г. до настоящего момента).

[khim@localhost khim]$ echo $((2+2))
4

[khim@localhost khim]$ echo "Прошло "((`date +%s` часов с \"начала времен\" Unix'а."
[khim@localhost khim]$

Рис. 3. Конструкция $((...)) — встроенный калькулятор bash

Разумеется, в bash есть и составные операторы. Но прежде чем к ним переходить, нужно рассказать о способах проверки условий, а для этого вспомнить, что в Linux, как и в DOS, каждая отработавшая команда сообщает системе код возврата.

Коды возврата и проверка условий

По общепринятому соглашению код возврата равен 0, если работа программы завершилась успешно, и другому числу в противном случае (рис. 4). Код возврата последней выполнившейся в данном сеансе команды содержится в переменной $?.

[khim@localhost khim]$ bzip2 /bin/bash
bzip2: Can't create output file /bin/bash.bz2: Доступ запрещен.

[khim@localhost khim]$ echo $?
1

[khim@localhost khim]$ bzip2 /bin/bash > /dev/null
[khim@localhost khim]$ echo $?
0

[khim@localhost khim]$

Рис. 4. Программа bzip2 в соответствии с общепринятым соглашением возвращает 0 при успешном завершении операции и 1 при неудачном

С этими кодами возможны разнообразные действия, из которых важнейшими являются логические операции: отрицание (?!?), конъюнкция (?&&?) и дизъюнкция (?||?), как это показано на рис. 5. (Не путайте конъюнкцию с параллельным запуском, а дизъюнкцию — с «трубой»!)

Заметьте, если результата выполнения первой команды достаточно для определения кода возврата всей конструкции, то вторая команда не вызывается: это видно из сравнения двух примеров использования ?||? на рис. 5.

[khim@localhost khim]$ ! bzip2 /bin/bash
bzip2: Can't create output file /bin/bash.bz2: Доступ запрещен.

[khim@localhost khim]$ echo $?
0

[khim@localhost khim]$ ! bzip2 -c /bin/bash > /dev/null
[khim@localhost khim]$ echo $?
1
[khim@localhost khim]$ bzip2 -c /bin/bash > /dev/null || bzip2 /bin/bash

[khim@localhost khim]$ echo $?
0

[khim@localhost
khim]$ bzip2 /bin/bash || bzip2 -c /bin/bash > /dev/null
bzip2: Can't create output file /bin/bash.bz2: Доступ запрещен.
[khim@localhost khim]$ echo $?
0

[khim@localhost khim]$ bzip2 /bin/bash && bzip2 -c /bin/bash > /dev/null
bzip2: Can't create output file /bin/bash.bz2: Доступ запрещен.
[khim@localhost khim]$ echo $?
1

[khim@localhost khim]$

Рис. 5. С кодами возврата возможны логические операции

Любое арифметическое выражение также можно записать как команду и получить для него код возврата (рис. 6). Обратите внимание на два последних примера. Не кажется ли вам, что тут замешана какая-то мистика: 0 дает в результате 1, а 2 — 0? Дело в том, что внутри арифметических операторов действуют соглашения языка Си, т. е. истиной является любое число, кроме нуля, а ложью — нуль, вовне же поступает обычный код возврата, для которого все наоборот.

[khim@localhost khim]$ ((57<2000)) ; echo $?
1
57 не больше 2000
[khim@localhost khim]$ x=3
[khim@localhost khim]$ y=8
[khim@localhost khim]$ ((x**2>=y+1)) ; echo $?
0
x^2 >= y+1 ; $ не обязателен
[khim@localhost khim]$ ((x++,y=0))
[khim@localhost khim]$ echo "x == $x ; y == $y"
x == 4 ; y == 8 переменные можно изменить -- поддерживаются большинство операторов языка Си
[khim@localhost khim]$ ((1-1)) ; echo $?
0
2 как результат арифметического выражения -- истина, т. е. 0
[khim@localhost khim]$ ((1-1)) ; echo $?
1
0 как результат арифметического выражения -- ложь, т. е. 1
[khim@localhost khim]$
Рис. 6. Арифметические выражения могут вырабатывать код возврата

Проверки условий в bash... нет. Вернее, есть, но не в том виде, какой привычен нам по опыту работы в DOS. Ею занимаются специальные команды (в основном внутренние), каждая из которых проверяет определенный набор условий. Все они возвращают 0, если условие выполнено, и 1 в противном случае.

[khim@localhost khim]$ [ -e /bin ] ; echo $?
0
← /bin -- существует
[khim@localhost khim]$ [ -e /bin/sh ] ; echo $?
0
← /bin/sh -- существует
[khim@localhost khim]$ [ -f /bin ] ; echo $?
1
← /bin -- НЕ [обычный] файл
[khim@localhost khim]$ [ -f /bin/sh ] ; echo $?
0
← /bin/sh -- нормальный файл (на самом деле это символическая ссылка на обычный файл; [ эти случаи не различает)
[khim@localhost khim]$ [ -L /bin/sh ] ; echo $?
0
/bin/sh -- символическая ссылка
[khim@localhost khim]$ [ -L /bin/bash ] ; echo $?
1
/bin/bash -- не символическая ссылка
[khim@localhost khim]$ [ "abc" == "123" ] ; echo $?
1
/bin/bash -- abc не равно 123
[khim@localhost khim]$ [ "abc" ">" "xyz" ] ; echo $?
1
/bin/bash -- abc не больше xyz
[khim@localhost khim]$ [ "57" == "2000" ] ; echo $?
1
/bin/bash -- СТРОКА 57 меньше, чем СТРОКА 2000
[khim@localhost khim]$ [ "abc" == "123" ] ; echo $?
1
/bin/bash -- ЧИСЛО 57 меньше, чем ЧИСЛО 2000
[khim@localhost khim]$
Рис. 7. Команда [

Самыми первыми появились команды test и [, различающиеся только тем, что [ для симметрии требует последним параметром символа ]. Эти команды предназначены в основном для проверки разнообразных условий, связанных со свойствами файлов. Сравнивать с их помощью строки тоже можно, хотя и не очень удобно (рис. 7). Лучше пользоваться более мощной командой [[: она допускает сравнение с шаблоном и предусматривает более мнемоническую запись конъюнкции и дизъюнкции (рис. 8).

[khim@localhost khim]$ [[ abc == *b* ]] ; echo $?
0
← abc подходит под шаблон *b*
[khim@localhost khim]$ [[ *b* == abc ]] ; echo $?
1
← а шаблон должен быть слева
[khim@localhost khim]$ [[ abc == *x* || abc == *c* ]] ; echo $?
0
← дизъюнкция
[khim@localhost khim]$ [[abc == *x* && abc == *c* ]] ; echo $?
0
← конъюнкция
[khim@localhost khim]$ [[ -f /bin/sh ]] ; echo $?
0
← проверки файлов тоже работают
[khim@localhost khim]$ [[ 57 .lt. 2000 ]] ; echo $?
0
← как и числовые проверки
[khim@localhost khim]$

Рис. 8. Команда [[

Составные операторы

Теперь, наконец, можно перейти и к составным операторам. Их довольно много: условный оператор (см. листинг 1), оператор выбора (см. листинг 2), несколько операторов цикла: while (см. листинг 3), until, отличающийся от while только отрицанием условия, два цикла for (см. листинг 4 и листинг 5) и, разумеется, функции: они используются в основном в сложных скриптах, поэтому пример в листинге 6 — совсем игрушечный. Обратите, однако, внимание на конструкцию $??, позволяющую задавать спецсимволы тем же способом, что в языке Си: — табуляция, — конец строки и т. д.

Параметры и массивы

В bash, как и в командном интерпертаторе DOS, поддерживаются позиционные переменные, соответствующие параметрам скрипта, — $1, $2,.. В DOS они называются %1, %2 и т. д., и таким способом обозначаются параметры только до девятого, а если их больше, до следующих приходится добираться с помощью команды shift. Эта команда в bash тоже есть (как вы, наверное, догадались, она пришла в DOS из Unix), но кроме того, к любому параметру можно обратиться и непосредственно. Хотя в силу исторических причин интерпретатор воспримет запись $10 как переменную $1, за которой следует 0, форма ${10}, ${11} и т. д. будет понята правильно. А переменная $# содержит общее число параметров. Кстати, если нужно обратиться к последнему параметру, это удобно сделать в форме ${!#} (см. врезку «Извлечение значений переменных» в первой части статьи).

Для передачи всех параметров в другую программу в bash предусмотрены две специальные переменные: $* и $@. Переменная $* содержит список параметров; разделителем служит первый из символов, хранящихся в переменной окружения IFS (это список разделителей слов, используемый в основном командой read). А вот $@ магическим образом раскрывается в $# параметров (если используются кавычки, то результат бывает забавен — см. рис. 9). Так как перебор параметров скрипта — весьма частая операция, то in ?$@? в цикле for можно опустить, как это сделано в листинге 6.

[khim@localhost khim]$ ( IFS=zyz ; echo "$+" )
123
[khim@localhost khim]$ for i in "Strange $@ result"
do echo "$i"
done
Strange 1
2
3 result

[khim@localhost khim]$

Рис. 9. Переменные $* и $@

Ввод—вывод

Работа с файлами в bash основана на потоковом вводе-выводе. Каждый поток представлен в программе уникальным целым числом — дескриптором, который передается командам чтения и записи. (Точно так же обстоит дело и в DOS.) Для чтения чаще всего применяется команда read, а для записи — команда echo; с обеими мы уже много раз встречались в примерах.

Стандартному вводному потоку соответствуют файл /dev/stdin и дескриптор 0, стандартному выводному — файл /dev/stdout и дескриптор 1. Сообщения об ошибках направляются в файл /dev/stderr, открытый с дескриптором 2, а дескрипторы, начиная с третьего, используются по усмотрению программиста.

Операции перенаправления, из которых пользователям DOS знакомы >, >> и <, в bash работают не только со стандартными вводным и выводным потоками, но и с любыми иными. Например, чтобы открыть файл для чтения с дескриптором n, следует написать n<имя_файла, а чтобы открыть его для записи или для дописывания в конец (append) — соответственно n>имя_файла или n>>имя_файла. Дескриптор стандартного вводного потока в первом случае, а также стандартного выводного во втором и в третьем разрешается опустить, и тогда конструкции начинают выглядеть и работать так же, как в DOS. Запись &>имя_файла означает перенаправление в заданный файл дескрипторов 1 и 2 (т. е. стандартного ввода и сообщений об ошибках).

Запись &n соответствует файлу, открытому с дескриптором n (еще один способ обозначить такой файл — /dev/fd/n), поэтому написав, скажем, m>&n, мы направим поток m в тот же файл, что и поток n. Написав n<&-, мы закроем файл с дескриптором n.

В bash есть и другие операции перенаправления. Конструкция n<>имя_файла позволит открыть файл и для чтения, и для записи. А конструкция <<разделитель, используемая только в скриптах, перенаправляет в стандартный вводной поток следующие за ней строки файла скрипта вплоть до той, которая состоит из заданного разделителя. Ее вариант <<-разделитель дополнительно удаляет из всех перенаправленных строк начальные символы табуляции.

Точно так же, как присваивание значений переменным, перенаправление ввода-вывода может распространяться и на одну команду, и на весь интерпретатор. Правда, синтаксис во втором случае иной, чем при присваивании: перед операцией перенаправления необходимо поставить команду exec (см. листинг 8).

О bash можно рассказывать еще и еще, но, как гласит пословица, лучше один раз увидеть, чем семь раз услышать. Попробовав поработать в командной строке и написать пару-тройку несложных скриптов, вы наверняка поймете, за что опытные пользователи Linux (и вообще Unix-систем) так любят командные интерпретаторы. Надеюсь, мне удалось вдохновить вас на подобный эксперимент.
kallypigos: (hybrid)

Кто командует парадом I?

Виктор Хименко

В этой статье речь пойдет о традиционном для UNIX-систем интерфейсе командной строки и о языке наиболее популярного в Linux командного интерпретатора bash.

В двух предыдущих статьях* мы рассмотрели файловую систему и управление процессами в ОС Linux. На все это мы глядели со стороны ядра: строго говоря, термин «Linux» и относится к ядру, а ОС в целом правильнее именовать GNU/Linux, поскольку многие критически важные ее компоненты взяты из системы GNU, создаваемой Фондом свободного ПО (Free Software Foundation, FSF). Именно так, кстати, делается в официальных названиях многих дистрибутивов (например, Debian GNU/Linux).

Настало время вспомнить и о пользователе — ведь это для него, собственно, создаются файлы и запускаются процессы, — а также о том, что для управления системой ему необходим пользовательский интерфейс. В этой статье речь пойдет о традиционном для UNIX-систем интерфейсе командной строки и о языке наиболее популярного в Linux командного интерпретатора bash.

Вы, возможно, удивитесь: есть же графические оболочки, такие как GNOME или KDE; именно благодаря им наблюдается сейчас бурный рост популярности Linux! Разве с их появлением командная строка не превратилась в никому не нужный анахронизм? Вовсе нет. Она по-прежнему остается самым удобным средством комбинирования программ и автоматизации рутинных процедур.

Что касается графических оболочек, то они одновременно и слишком просты, и слишком сложны. Элементарные действия вроде запуска отдельных программ и основных операций с файлами выполняются там очень похоже на то, как это происходит в Windows, и пользователь, знакомый с Windows, легко освоит их без посторонней помощи. Организация же взаимодействия программ, наоборот, требует довольно высокой программистской квалификации: например, среда GNOME основана на модели CORBA, а манипулировать CORBA-объектами весьма непросто. Командный интерпретатор предоставляет в наше распоряжение некую «золотую середину» — возможности весьма широкие и при этом относительно легко осваиваемые.

Примеры и иллюстрации, как и в предыдущих статьях, приводятся на материале дистрибутива KSI-Linux Release 3.0 (Manticore).

Скрипты и интерпретаторы

Командный интерпретатор, как следует из его названия, интерпретирует команды, т. е. выполняет их непосредственно (без предварительной компиляции). Он обрабатывает команды, вводимые пользователем в командной строке, а также скрипты — заранее подготовленные последовательности команд, хранящиеся в текстовом виде.

Надо сказать, что скрипты играют в GNU/Linux (и UNIX вообще) куда более важную роль, чем командные файлы в Windows и DOS. Например, из более чем тысячи (!) программ в каталоге /usr/bin того компьютера, на котором пишутся эти строки, примерно четверть является скриптами того или иного вида, а уж количество вспомогательных скриптов, используемых разными программами для внутренних нужд и не предназначенных для исполнения «широкой публикой» (а потому хранящихся в других каталогах), вообще не поддается учету. На плечи скриптов ложится и большая часть «тяжелой работы» по запуску системы. А если требуется автоматизировать какие-либо действия, то самый простой способ — опять-таки написать несложный скрипт.

В любой «полноценной» (не сокращенной для помещения в тостер или мобильный телефон) версии GNU/Linux имеется не менее двух командных интерпретаторов плюс еще три-четыре языка скриптов, не используемых в командной строке (таких как perl, tcl, python или scheme), и это не считая «мини-языков» типа sed или awk. Почему бы не ограничиться одним интерпретатором и его командным языком? Главным образом потому, что люди не похожи друг на друга и у них разные предпочтения. И чтобы учесть интересы максимального числа пользователей, создатели дистрибутивов включают в них по несколько интерпретаторов, а администраторы обычно предоставляют пользователям своих систем право выбрать по собственному вкусу язык для работы в командной строке.

Из всех командных интерпретаторов для UNIX-систем два являются «классическими». Это B Shell (Bourne Shell), созданный Стефеном Бурном (Stephen R. Bourne) для седьмой версии UNIX, и C Shell, разработанный в Беркли Уильямом Джоем (William N. Joy). Язык C Shell, основанный на командном интерпретаторе шестой версии UNIX, содержал ряд расширений, помогающих в интерактивной работе и в написании скриптов: историю команд, псевдонимы (aliases), массивы и многое другое. Однако при всех своих несомненных преимуществах он имел один очень серьезный недостаток — был несовместим с B Shell.

Поэтому, когда FSF разработал интерпретатор bash (Bourne-Again SHell), сочетающий синтаксис B Shell с мощью C Shell, привлекательность C Shell значительно снизилась. И хотя многие бывшие пользователи BSD или коммерческих версий UNIX используют C Shell при работе в GNU/Linux, стандартом де-факто в этой ОС является bash. (Впрочем, для аварийных дискет bash, занимающий «целых» 420 Кбайт, великоват, и на них часто помещают более компактный интерпретатор, например A Shell, вмещающийся в 62 Кбайт.)

Именно bash интерпретирует основную массу скриптов из /usr/bin и подавляющее большинство вспомогательных скриптов. (Поскольку B Shell не может быть включен в GNU/Linux по лицензионным соображениям, скрипты, изначально рассчитанные на B Shell, также интерпретируются посредством bash.) Поэтому из всех командных интерпретаторов пользователю GNU/Linux в первую очередь необходимо освоить bash.

Подробно описывать bash в журнальной статье невозможно, да, впрочем, и не слишком нужно: в конце концов, он снабжен весьма подробной документацией, которая вызывается командой info bash. Здесь же мы остановимся на наиболее характерных и интересных его особенностях.

Команды и метасимволы

Конечно, bash может выполнять любые команды, имеющиеся в системе, но некоторые из них являются подпрограммами интерпретатора (внутренние команды), а некоторые другие, хотя и представляют собой самостоятельные программы, специально предназначены для использования в командных скриптах (внешние команды). Внутренних и внешних команд bash насчитывается более сотни; перечень наиболее, на мой взгляд, часто применяемых с краткими описаниями приводится во врезке на с. 154. (Оценка употребительности, разумеется, чисто субъективная: я, например, обычно получаю имя файла без пути с помощью конструкции ${filename//*/}, а кто-то, возможно, использует для этого специальную команду basename, хотя она внешняя и из-за этого работает несколько медленнее.)

Как же устроена сама команда? Ее базовая структура во всех языках скриптов одинакова и весьма проста: сначала записывается имя команды, за ним может следовать определенное число опций (ключей) и аргументов (параметров), отделяемых от имени и друг от друга пробелами. Регистр символов существенен в любом месте команды; имена большинства команд записываются строчными буквами. Специальные символы — ?*?, ?$?, ??? ?!?, ?>?, ?

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

Радости интерактивной работы

Надо сказать, что для интерактивной работы bash предоставляет массу удобств (на которые вы уже, скорее всего, обращали внимание, если работали в GNU/Linux). Он поддерживает такие средства редактирования командной строки, как повтор символов, макросы, «карман» (буфер) и т. д., а также историю (т. е. возможность повторить ранее введенную команду) и настраиваемое автоматическое дополнение.

Так, чтобы запустить, скажем, программу mysql_ convert_table_format, достаточно набрать в командной строке mysql_co и нажать клавишу табуляции: bash, зная названия доступных команд, сам «допишет» имя. (Если в системе есть несколько команд, начинающихся с заданного префикса, он выдаст их перечень, а если их более 100, то предварительно уточнит, действительно ли нужен такой огромный список. Кстати, с помощью данного свойства bash легко выяснить число доступных команд: для этого достаточно нажать клавишу табуляции, находясь в начале строки.) А когда название команды введено (и после него поставлен пробел), интерпретатор позволяет тем же способом ввести имя файла.

Автозаполнение также можно вызвать, нажав клавишу

(в ее роли обычно выступает ) одновременно с одним из специальных символов: ?/? вызывает дополнение имени файла, ?!? — команды, $ — переменной, ?~? — пользователя, @ — машины. А при нажатии последовательно клавиш +x и соответствующего специального символа выдается список возможных вариантов дополнения.

Но и это еще не все. Например, автодополнение можно программировать... Вернемся, однако, к языку интерпретатора bash.

Шаблоны

Поскольку ряд идей B Shell был использован при создании командных интерпретаторов DOS и Windows NT (Windows 9X не имеет собственного интерпретатора), многие конструкции bash могут показаться вам знакомыми. Однако это сходство зачастую обманчиво и нередко вводит в заблуждение пользователя DOS/Windows. Хорошей иллюстрацией здесь могут послужить шаблоны.

Базовые правила задания шаблонов для имен файлов в bash довольно просты: ?*?, как и в DOS, означает любое число любых символов, а ??? — любой одиночный символ. Кроме того, можно перечислить символы в квадратных скобках (разрешается вставлять между ними пробелы); а символ ?^? или ?!? в начале такого списка будет указывать, что символы не должны встречаться в данной позиции.

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

Рис. 1. Что же здесь произошло?

Посмотрите на рис. 1: исходя из опыта работы в DOS естественно было бы предположить, что каждый из файлов с именем вида ?*.static? будет скопирован в файл с таким же именем, но без расширения, а образовался файл с диким именем ?*.? (впрочем, это произошло только потому, что в каталоге имелся всего один файл, подходивший под шаблон; если бы их оказалось несколько, bash выдал бы сообщение об ошибке).

Как же тогда получить имена без расширений (точнее, с отсеченной частью после точки — в Linux нет расширений в понимании DOS)? Об этом вы узнаете в конце следующего раздела, посвященного переменным.

Переменные

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

Рассмотрим команду, которая «дописывает» в переменную окружения CLASSPATH путь к архиву JAVApackage (подобные команды часто вставляются в конфигурационные файлы инсталляторами различных программ). В DOS она имела бы приблизительно следующий вид:


set CLASSPATH=%CLASSPATH%;c:Program
 FilesBig Program
JAVApackage.jar


А в «версии для Linux» она может выглядеть так:


CLASSPATH=?$CLASSPATH${CLASSPATH:+:}
/opt/big-program/
JAVApackage.zip? 
export CLASSPATH


или так:


export CLASSPATH=?$CLASSPATH${CLASSPATH:+:}/opt/
big-program/JAVApackage.zip?


Как видим, в DOS переменные ограничиваются с двух сторон символами ?%?, а в bash маркируется только их начало — символом ?$?: признаком конца служит первый символ, не разрешенный в именах переменных (разрешены буквы, цифры и символ подчеркивания). Кроме того, в bash нет команды, аналогичной SET: интерпретатор распознает присваивание значения переменной просто по наличию знака равенства.

Кстати, благодаря тому, что установка переменной окружения в bash не требует отдельной команды, ее можно сделать частью любой команды (рис. 2). Присвоенное таким образом значение действительно только для данной команды, а в среду bash изменения не вносятся.

Рис. 2. Присваивание значения переменной окружения может быть не только отдельной командой, но и частью другой команды

Вернемся, однако, к нашему примеру. Несмотря на более короткую форму записи самих переменных и операции присваивания, «Linux-версия» оказалась длиннее. Во-первых, там, где командный язык DOS обходится одним-единственным знаком ?;?, она содержит устрашающего вида конструкцию ${CLASSPATH:+:}, а во-вторых, в ней присутствует несколько загадочная для пользователя DOS команда export.

И то, и другое — следствие заботы о безопасности. Команда export делает переменную доступной другим командам. В командных файлах DOS переменные всегда внешние, и в подавляющем большинстве случаев это действительно нужно, поскольку переменные служат почти исключительно для обмена данными между программами. В bash же широко используются внутренние переменные — в качестве счетчиков, для хранения промежуточных результатов вычислений или имен файлов и т. д. Поэтому переменные, которые должны быть доступны за пределами данного скрипта, специальным образом отмечаются. Конечно, маловероятно, что имя внутренней переменной случайно совпадет с именем переменной окружения, в результате чего значение последней окажется испорченным и какая-то программа начнет работать неправильно, но, как говорил Козьма Прутков, «лучше перебдеть, чем недобдеть».

Конструкция ${CLASSPATH:+:} вставляет в строку двоеточие (которое в bash служит разделителем элементов CLASSPATH, а также PATH, играющей ту же роль, что и в DOS), но лишь при условии, что строка CLASSPATH не является пустой. Без этой меры предосторожности результатом выполнения команды могла бы оказаться переменная CLASSPATH вида :/opt/big-program /JAVApackage. zip, т. е. с пустым элементом в начале. Такой элемент обозначает текущий каталог, который в Linux, в отличие от DOS, необходимо включать в CLASSPATH (и в PATH) в явной форме. Причем в большинстве дистрибутивов это не делается — из тех же соображений «как бы чего не вышло».

Данное обстоятельство часто сбивает с толку начинающих пользователей Linux:

— Как же так: я ведь и атрибуты executable for all на файл MyGreatCommand поставил, и в первой строке #!/bin/sh написал, а мне все равно говорят: command not found!

— Конечно! Ведь ты же ее в PATH не поместил!

— Какой PATH? Она у меня в текущем каталоге!

— А у тебя разве текущий каталог входит в PATH?

— ???

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

Если в DOS с переменной можно сделать, грубо говоря, две вещи — присвоить ей значение и извлечь значение, присвоенное ранее, — то в bash вариантов намного больше: скажем, извлечь значение можно десятком разных способов, включая условное извлечение (с которым мы познакомились на примере конструкции ${CLASSPATH:+:}), извлечение подстроки и извлечение с использованием шаблона. В частности, конструкция ${X##шаблон} позволяет, извлекая строку, удалить из нее максимально возможную соответствующую шаблону подстроку, считая от начала, а ${X%шаблон} — минимально возможную, считая с конца. Так что отсечь «хвосты» упомянутым в предыдущем разделе именам файлов можно было бы, например, следующим образом:


for i in /bin/*.static
do j=${i##*/}
cp ?$i? ?${j%.static}?
done


Подробнее о разных вариантах извлечения переменных рассказывается во врезке на с. 156. А операторами for и do мы займемся во второй части статьи.

Системные переменные

Помимо переменных, используемых различными программами, в Linux, как и в DOS, есть специальные, или «системные» переменные, значение которых определено заранее, причем их намного больше. Так, DOS имеет переменную PROMPT, содержащую приглашение командной строки, а в bash ей соответствуют четыре переменных: PS1 — основное приглашение; PS2 — «вспомогательное» приглашение, выдаваемое, когда команда не уместилась на одной строке; PS3 — приглашение «команды» select (на самом деле это не команда, а специальная конструкция bash, призванная облегчить выбор из нескольких вариантов; впрочем, она используется довольно редко); PS4 — приглашение перед командами скрипта, выводимыми в режиме трассировки (заметим, что в bash, в отличие от командного интерпретатора DOS, скрипты по умолчанию не трассируются).

В документации bash описано множество переменных, устанавливаемых интерпретатором или влияющих на его поведение. Назовем для примера $RANDOM, дающую доступ к простому генератору псевдослучайных чисел, и $!, значение которой равно PID последней команды, запущенной из данного экземпляра интерпретатора на асинхронное выполнение. Нам уже встречались системные переменные ${CLASSPATH, $PATH, а также $LC_ALL, определяющая страну и язык. С другими, такими как $? — возвращаемое значение — или $* — список параметров, — мы познакомимся в дальнейшем.

Виктор Хименко, khim@rnktech.com

Окончание в следующем номере.


* В. Хименко. «Файлы, файлы, файлы». «Мир ПК», № 2/2000, с. 64; № 3/2000, с. 50. «Процессы, задачи, потоки и нити». «Мир ПК», № 5/2000, с. 42; № 6/2000, с. 54.


Команды bash

Перед тем как перечислять в алфавитном порядке наиболее употребительные команды bash, необходимо назвать три «справочных» команды, используемых почти исключительно при интерактивной работе, — help, info и man. Команда help выдает краткое описание любой встроенной команды bash, info предоставляет доступ к входящему в состав системы GNU развернутому справочнику, в котором bash, разумеется, подробно описан. Команда man позволяет обратиться к другому, более старому справочнику, где есть информация о ряде команд, не описанных в справочнике info (вообще говоря, команда info, не найдя сведений в собственном справочнике, ищет их и в справочнике man, однако кое-что можно получить только с помощью самой man). Естественно, команда help help позволяет получить справку по help, команда info info — по info, а man man — по man.

В приводимом ниже списке каждая команда снабжена пометкой, указывающей, как получить ее более подробное описание: (b) означает, что команда встроенная и, следовательно, информацию о ней предоставляет команда help, (i) соответствует команде info, (m) — команде man.

. (b) — синоним для команды source

: (b) — синоним для команды true

[ (b) — сокращение для команды test, но, в отличие от нее, требует закрывающей квадратной скобки

(( (b) — соотносится с командой let так же, как [ соотносится с test

[[ (b) — не вполне команда, а особое выражение, очень похожее на команду [ (test)

alias(b) — позволяет задавать псевдонимы для других команд

at(m) — ставит программу в очередь на выполнение в заданное время

atq(m) — в заданное время проверяет очередь программ на выполнение

atrm(m) — в заданное время удаляет программу из очереди на выполнение

awk(i) — язык для построчного сканирования и обработки файлов: простой, маленький и быстрый, но притом достаточно мощный

batch(m) — выполняет программу, когда система не слишком загружена

builtin(b) — позволяет вызвать встроенную команду bash, даже когда ее имя перекрыто именем функции или псевдонимом

bzip2(i) — более новая, чем gzip, программа сжатия файлов; работает медленнее, чем gzip, но обеспечивает лучший коэффициент сжатия

cat(i) — «склеивает» заданные файлы и выдает их на стандартный выход

cd(b) — изменяет текущий каталог

chgrp(i), chmod(i), chown(i) — изменяют соответственно группу, права доступа и владельца файла

command(b) — позволяет вызвать команду — встроенную или внешнюю, даже когда ее имя перекрыто именем функции или псевдонимом

cp(i) — копирует файлы и каталоги

cpio(i) — CoPy In/Out — системная программа создания архивов; не содержит встроенной поддержки сжатия файлов, но может использоваться совместно с gzip или bzip2

crontab(m) — позволяет модифицировать список регулярных заданий пользователя

cut(i) — выдает на стандартный выход выбранные части строк текстового файла

dd(i) — копирует файл блоками, выполняя одновременно некоторые дополнительные действия

du(i) — вычисляет объем, занятый на диске указанными файлами

declare(b) — позволяет задать имя и тип переменной (применяется не слишком часто, так как bash допускает использование необъявленных переменных)

df(i) — сообщает количество свободного и занятого места на диске

diff(i) — находит различия между двумя файлами

dirs(b) — выводит список запомненных подкаталогов

echo(b/i) — выводит на стандартный выход заданное сообщение

enable(b) — позволяет разрешить или запретить использование встроенных команд

eval(b) — выполняет аргументы так, как если бы они были введены в командной строке (ранее часто использовалась для обращения к переменной, имя которой содержится в другой переменной)

exec(b) — выполняет системный вызов exec, т. е. замещает процесс, где исполняется скрипт, другим, заданным в качестве параметра; часто используется в так называемых «скриптах-обертках» (wrapper scripts), настраивающих среду для выполнения программ

exit(b) — завершает работу командного интерпретатора (и, стало быть, скрипта)

export(b) — делает переменные данного скрипта доступными для других процессов, запущенных из командного интерпретатора

file(m) — определяет тип файла (по содержимому; эвристический анализ выполняется на основе гибкой настраиваемой базы данных)

find(m/i) — ищет файлы по множеству признаков, но не по содержимому

false(b/i) — возвращает код ненормального завершения

getopts(b) — довольно сложная команда, похожая на аналогичное средство системной библиотеки; позволяет создавать скрипты, понимающие сложные опции

grep(m) — ищет строки в файлах; может использоваться совместно с командами find и xargs для поиска файлов по содержимому

gzip(i) — стандартная для GNU программа сжатия файлов; способна распаковывать (но не создавать) файлы в формате compress — более старой UNIX-программы сжатия

install(i) — копирует файлы, одновременно позволяя устанавливать их атрибуты

kill(b/m) — позволяет послать процессу сигнал; по умолчанию посылается сигнал SIGTERM, останавливающий процесс; отсюда такое устрашающее название

less(m) — улучшенная по сравнению с more программа просмотра файлов

let(b) — вычисляет арифметическое выражение; выражение может содержать многие операторы языка Си, а также переменные

local(b) — создает локальную (внутри функции) переменную

logout(b) — завершает работу командного интерпретатора, являющегося основным (login shell)

ln(i) — создает ссылки на файлы (дополнительные жесткие или символические)

ls(i) — выводит список файлов (например, для заданного каталога)

md5sum(i) — подсчитывает для файлов 128-битовую контрольную сумму

mkdir(i) — создает подкаталог

mktemp(m) — создает временный файл (чтобы избежать «дыр» в безопасности, создавайте временные файлы только с помощью mktemp)

more(m) — постранично выводит файл на экран (служит для просмотра длинных файлов)

mv(i) — перемещает или переименовывает файлы (каталоги)

patch(i) — применяет diff-файл (см. diff) к исходному файлу

popd(b) — удаляет подкаталоги из списка запомненных подкаталогов

printf(b/i) — обеспечивает форматированную печать данных (имеет много общего с одноименной функцией стандартной библиотеки Си)

pushd(b) — добавляет подкаталог в список запомненных подкаталогов и перемещает подкаталоги внутри этого списка

pwd(b/i) — выводит путь к текущему каталогу

read(b) — считывает строку со стандартного ввода и присваивает прочитанные значения указанным переменным

readonly(b) — защищает переменную от случайных изменений

return(b) — выходит из функции и передает управление в вызвавшую программу

rm(i) — удаляет файлы (подкаталоги)

rmdir(i) — удаляет пустые подкаталоги

sed(i) — потоковый редактор (a Stream EDitor); дает возможность быстро производить с текстом простые операции (например, поиск с заменой)

select(b) — довольно сложная команда, позволяющая организовывать меню с выбором вариантов из списка (в действительности это даже не команда, а особая синтаксическая форма, родственная синтаксическим формам while и for)

set(b/i) — очень сложная команда:


  • без параметров выдает список всех определенных на данный момент переменных и функций

  • с параметрами вида +

  • все прочие параметры присваиваются последовательно переменным $1 $2 ... $N

(Команда help set не дает полного описания set; оно есть только в описании bash, получаемом командой info bash.)

shift(b) — сдвигает позиционные параметры ($1 становится равным $N, $2 — $N+1, $3 — $N+2 и т.д.)

sort(i) — сортирует файл

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

tar(i) — программа создания архивов (Tape ARchiver); не содержит встроенной поддержки сжатия файлов, но может использоваться совместно с gzip или bzip2

test(b/i) — вычисляет значение логического выражения; в основном проверяет атрибуты файлов (существует? пуст? исполняемый? подкаталог? и т. д.), однако может также сравнивать строки

tr(i) — заменяет одни символы на другие по заданной таблице подстановки

trap(b) — позволяет связать с сигналом особую обработку

true(b/i) — возвращает код успешного завершения

type(b) — возвращает «тип» слова, заданного в качестве аргумента (встроенная команда, псевдоним, функция и т. д.)

ulimit(b) — устанавливает или сообщает системные квоты для процесса (процессов)

umask(b) — назначение описано в статье «Файлы, файлы, файлы»

unalias(b) — удаляет имя из списка псевдонимов

uniq(i) — выводит уникальные (или, наоборот, повторяющиеся) строки в отсортированном файле

unset(b) — удаляет имя из списка переменных

wc(i) — подсчитывает число символов, слов и строк в файле

xargs(m) — получает параметры со стандартного входа и вызывает с этими параметрами заданную программу (по умолчанию echo)

Как уже говорилось, здесь перечислены далеко не все команды. В типичной системе GNU/Linux их значительно больше: есть, например, команды, выводящие восьмеричный и шестнадцатеричный дамп памяти (od и hexdump), печатающие начало и конец файла (head и tail), а ко многим упомянутым командам есть дополнительные (например, diff3 позволяет сравнить три файла, а bzcat — просмотреть файл, упакованный программой bzip2). Не попали в наш обзор и системные переменные, имеющие для bash особый смысл. Обо всем этом и о многом другом вы сможете узнать, набрав в командной строке слова info bash.

Вернуться


Извлечение значений переменных


[khim@localhost tmp]$ VAR1=1234567890
[khim@localhost tmp]$ VAR2=0987654321
[khim@localhost tmp]$ echo "$VAR1 $VAR2
 XXX${VAR1}XXX ZZZ${VAR2}ZZZ"
1234567890 0987654321 XXX1234567890XXX
 ZZZ0987654321ZZZ
[khim@localhost khim]$


$ X или ${X} — просто извлечь значение из переменной X (фигурные скобки необходимы тогда, когда после имени переменной следует буква или цифра).


[khim@localhost khim]$ ptr=VAR1
[khim@localhost khim]$ echo ${!ptr}
1234567890
[khim@localhost khim]$ ptr=VAR2
[khim@localhost khim]$ echo ${!ptr}
0987654321
[khim@localhost khim]$


${!X} — извлечь значение из переменной, имя которой хранится в переменной X. Вместе с массивами этого достаточно для создания и обработки весьма нетривиальных структур данных.


[khim@localhost tmp]$ echo "${#VAR1}"
10
[khim@localhost tmp]$ echo "${VAR1:${#VAR1}-3}"
890
[khim@localhost tmp]$


${#X} — получить длину строки X; эту операцию удобно комбинировать с извлечением подстроки.


[khim@localhost tmp]$ echo
 ${VAR4:?can not proceed
 without VAR4} ; echo Ok
bash: VAR4: can not proceed without VAR4
[khim@localhost tmp]$


${X:?выражение} — извлечь значение переменной, а если она не определена, остановить выполнение скрипта.


[khim@localhost tmp]$ echo
 "${VAR1:-ABCDEF} ${VAR3:-ABCDEF}"
1234567890 ABCDEF
[khim@localhost tmp]$ echo
 "${VAR1:-ABCDEF} ${VAR3:-FEDCBA}"
1234567890 FEDCBA
[khim@localhost tmp]$


${X:-выражение} — условное извлечение: если переменная определена (как VAR1), используется ее значение, иначе — заданное альтернативное выражение (как в случае с VAR3).


[khim@localhost tmp]$ echo
 "${VAR1:=ABCDEF} ${VAR3:=
ABCDEF}"
1234567890 ABCDEF [khim@localhost
 tmp]$ echo "${VAR1:
=ABCDEF} ${VAR3:=FEDCBA}"
1234567890 ABCDEF
[khim@localhost tmp]$


${X:=выражение} — то же, но альтернативное выражение становится на будущее значением переменной.


[khim@localhost tmp]$ echo "${VAR1:5}
 ${VAR2:5:3}"
67890 543
[khim@localhost tmp]$


${X:N1[:N2]} — извлечь из переменной X подстроку, начинающуюся с N1-го символа (и заканчивающуюся N2-м).


[khim@localhost tmp]$ echo "${VAR1#*[37]}
 ${VAR2#*[37]} 
${VAR3#*[37]}"
4567890 654321 ABCDEF
[khim@localhost tmp]$ echo "${VAR1##*[37]}
 ${VAR2##*[37]} 
${VAR3##*[37]}"
890 21 ABCDEF
[khim@localhost tmp]$ echo "${VAR1%[37]*}
 ${VAR2%[37]*} 
${VAR3%[37]*}"
123456 0987654 ABCDEF
[khim@localhost tmp]$ echo "${VAR1%%[37]*}
 ${VAR2%%[37]*} 
${VAR3%%[37]*}"
12 098 ABCDEF
[khim@localhost tmp]$


${X#шаблон}, ${X##шаблон}, S{X%шаблон}, S{X%%шаблон} — извлечь строку, удалив из нее часть, соответствующую шаблону. Шаблон строится по тем же правилам, что и для имен файлов, т. е. ?*[37]? — это любая последовательность символов, а затем либо ?3?, либо ?7?, а ?[37]*? — это ?3? или ?7?, а затем любая последовательность символов. Операции ?#? и ?%? удаляют минимальную возможную подстроку, ?##? и ?%%? — максимальную, причем ?#? и ?##? — с начала строки, а ?%? и ?%%? — с конца.


[khim@localhost tmp]$ CDPATH=/bin
[khim@localhost tmp]$ CDPATH=/newpath$
{CDPATH:+:$CDPATH}
[khim@localhost tmp]$ echo ${CDPATH}
/newpath:/bin
[khim@localhost tmp]$ unset CDPATH
[khim@localhost tmp]$ CDPATH=/newpath$
{CDPATH:+:$CDPATH}
[khim@localhost tmp]$ echo ${CDPATH}
/newpath
[khim@localhost tmp]$


${X:+выражение} — операция, обратная условному извлечению. Может показаться мистической, но используется не так уж редко.


[khim@localhost tmp]$ echo "${VAR1/[123]/x}
 ${VAR2/
[123]/x} ${VAR3/[123]/x}"
x234567890 0987654x21 ABCDEF
[khim@localhost tmp]$ echo "${VAR1//[123]/x}
 ${VAR2//
[123]/x} ${VAR3//[123]/x}"
xxx4567890 0987654xxx ABCDEF
[khim@localhost tmp]$


${X/шаблон/выражение}, ${X//шаблон/выражение} — извлечь строку, заменив в ней часть, соответствующую шаблону, заданным выражением (поиск с заменой). Операция ?/? выполняет замену однократно, а ?//? повторяет ее до победного конца.

kallypigos: (hybrid)

Процессы, задачи, потоки и нити

Виктор Хименко

Начнем с простого вопроса: сколько понятий Linux фигурирует в заголовке статьи? Как ни удивительно, разные знатоки системы вполне могут назвать в ответ разные числа в диапазоне от одного до трех. Почему до трех — ясно: в тождестве между «потоком» и «нитью» никто не сомневается, поскольку оба термина соответствуют английскому thread. Просто первый из них традиционно использовался в русскоязычной технической литературе, хотя некоторые считают его неудобным из-за многозначности, а второй — более новый и этого недостатка лишен.

Очевидно также, что все перечисленные в заголовке термины имеют отношение к параллельным вычислениям и обозначают вычислительную процедуру, выполняемую вместе с другими такими же. Но на этом ясность кончается, и по простым, казалось бы, вопросам — есть ли разница между процессом и задачей, а также между процессом и нитью (потоком) — среди «профи» единодушия нет. Причем быстро объяснить суть разногласий невозможно: сначала потребуется довольно много внимания уделить управлению процессами (задачами, потоками) в Linux.

Процесс и его атрибуты

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

Список процессов, выполняющихся в данный момент в системе, позволяют увидеть программы top (рис. 1) и ps (с ней мы познакомимся ниже).

Идентификаторы процесса, сессии, группы

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

Войдем в систему и зададим команду:


          dd if=/dev/random bs=1024 count=1024 | wc -c



Этим мы запустим две программы — dd и wc, причем результат работы первой будет подаваться на вход второй. Программа dd прочтет 1024 блока с псевдоустройства /dev/random, генерирующего криптографически стойкие случайные числа, а wc подсчитает число знаков в образовавшейся последовательности. Поскольку получение таких чисел без специального аппаратного обеспечения — дело долгое, мы успеем поэкспериментировать с нашим процессом. (Блоки должны иметь длину 1024 байта, но это лишь ограничение сверху: dd не ждет заполнения буфера, и в результате в каждом блоке фактически оказывается один—два байта.)

Теперь нажатием +Z приостановим выполнение программ, зададим ту же команду еще раз и посмотрим на происходящее с другого терминала, введя на нем команду ps af, которая выдает на экран список имеющихся процессов (1). Затем нажмем +C, чтобы остановить два процесса, запущенных последними, и снова взглянем на ситуацию с помощью ps (2). Теперь выйдем из системы (logout) и проделаем то же самое в третий раз (3). Мы обнаружим, что все процессы на консоли vc/1 исчезли.

Для каждого процесса команда ps показывает его состояние, или, как часто говорят, статус (Stat — Status: T — приостановлен, R — активен, S — «спит»), числовой идентификатор (PID — Process ID). С помощью отступов и знаков ?\_? нарисовано «генеалогическое древо» процессов: login (команда входа в систему) породила bash (командный интерпретатор), bash породил dd, wc, снова dd и снова wc...

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

Действительно, на консоли vc/1 в общей сложности было запущено шесть процессов: login, bash, два dd и два wc. Что позволило ядру системы определить, какие именно процессы следует приостановить при нажатии +Z, какие остановить при нажатии +C и какие уничтожить при получении команды logout?

Это стало возможным благодаря двум атрибутам — «номеру сессии» (Session ID — SID) и «номеру группы процессов» (Process Group ID — PGID). Все запущенные на определенном терминале процессы входят в одну сессию, при этом некоторые объединены в группы (как dd и wc в нашем примере). В каждый момент терминалом владеет какая-то одна группа процессов, и только ее члены могут считывать с него данные (если это попытается сделать процесс из другой группы, он будет приостановлен). В нашем примере так были считаны нажатия +Z и +C, вызвавшие соответственно приостановку и остановку групп, которые владели в тот момент терминалом. При выходе пользователя из системы останавливаются все процессы сессии.

Права и полномочия

Мы еще вернемся к вопросу о взаимодействии процессов между собой, а сейчас вспомним о том, что им необходимо общаться с внешним миром, причем разные процессы должны иметь разные права. Для этой цели в ядре каждому процессу сопоставлены атрибуты UID (User ID), он же RUID (Real User ID), EUID (Effective User ID), SUID (Saved User ID), FSUID (FileSystem User ID), GID (Group ID), он же RGID (Real Group ID), EGID (Effective Group ID), SGID (Saved Group ID), FSGID (FileSystem Group ID), набор дополнительных (supplementary) групп Groups, а также три набора полномочий (capabilities).

Резонно спросить: не слишком ли здесь много атрибутов? И зачем нужно такое чудовищное их количество? Действительно, в большинстве операций используются только EUID/EGID либо FSUID/FSGID: первая пара — когда операция не касается непосредственно манипуляций с файловой системой, вторая — когда касается. Если UID файла совпадает с FSUID, процесс может делать то, что разрешено владельцу файла; если нет, но GID файла совпадает с FSGID или с идентификатором одной из дополнительных групп, — то, что разрешено группе файла. Если же файл — «посторонний», используются оставшиеся права доступа.

Атрибуты RUID/RGID сохраняют свое значение при запуске программы, даже если содержащий ее файл имеет атрибут SUID (заметим, что атрибут файла SUID — Set User ID — и атрибут процесса SUID — Saved User ID — ничего общего между собой не имеют, разумеется, кроме названия). Это позволяет программам типа passwd (установка пароля) вести себя по-разному при запуске обычным пользователем и суперпользователем.

С помощью атрибутов SUID/SGID можно временно уменьшить уровень привилегий процесса, а затем восстановить его. Для чего это может понадобиться? Представьте себе, например, программу, позволяющую разным пользователям выполнять какие-либо операции с файлами. Для авторизации пользователя такая программа должна иметь доступ к базе авторизации, в которой хранится информация о пользователях. Поэтому она запускается с правами суперпользователя, а после ввода необходимой информации меняет свой EUID, выполняет запрошенные пользователем операции с его правами, а затем возвращает себе права суперпользователя. При этом секретные данные (та же база авторизации) ни в какой момент не становятся доступны пользователю.

Для набора дополнительных групп никаких специальных SGroups или RGroups не предусмотрено. И обычный процесс не может изменить данный набор — для этого ему необходимы соответствующие полномочия.

Полномочиями называются права на выполнение критических операций в системе, таких, например, как изменение прав доступа к файлу, не принадлежащему пользователю с идентификатором FSUID, обращение к «железу» или упомянутая выше модификация набора дополнительных групп. Различаются полномочия действующие (effective) — те, которые процесс сейчас имеет, передаваемые по наследству (inheritable) — те, которыми он вправе наделить порожденный процесс, и разрешенные (permitted) — те, которые он может получить сам (аналогично SUID/SGID для обычных прав).

В настоящее время действующими полномочиями может обладать только процесс с EUID=0, т. е. выполняемый суперпользователем, а разрешенными — процесс с RUID=0 или SUID=0. При запуске программы, файл которой имеет атрибут SUID и принадлежит пользователю с UID=0, процесс получает полномочия, максимально допустимые в системе.

Кстати, ни один процесс в системе не может иметь права и полномочия выше максимального уровня, и любое снижение уровня необратимо: способа «вернуть назад» однажды отобранные привилегии не существует ни для конкретного процесса, ни (естественно) для системы в целом. Это позволяет, например, сделать неудаляемыми и неизменяемыми файлы журналов регистрации событий (log-файлы): присвоив им атрибут append-only, с которым файл нельзя ни удалить, ни изменить (разрешается только дописывать в него новую информацию), вы затем изымаете из системы полномочие CAP_LINUX_ IMMUTABLE. Теперь атрибут не сможет снять никто, включая суперпользователя, и злоумышленнику, сумевшему проникнуть в систему, не удастся уничтожить следы своего пребывания. Такая защита нередко применяется в брандмауэрах (firewalls).

Приоритеты

Многозадачная система немыслима без атрибутов, управляющих планировщиком заданий. Очевидно, что не все процессы равноправны: например, демону xntpd, который синхронизирует часы на машинах сети, требуется для работы не слишком много машинного времени, но очень важно, чтобы это небольшое время выделялось ему по первому требованию. Поэтому каждому процессу планировщик присваивает определенный приоритет. Его значение можно увидеть в выводе программ top и ps, но нельзя изменить.

Для воздействия на приоритет запускаемого процесса служит атрибут под названием nice value, что можно перевести как «степень дружелюбия». Он представляет собой число в диапазоне от -20 до 20, которое тем меньше, чем менее процесс «дружелюбен» (nice) по отношению к другим процессам в системе и, стало быть, чем более высокий приоритет ему должен быть «при прочих равных» назначен. Повысить собственное «дружелюбие», снизив приоритет, может любой процесс, а чтобы стать менее «дружелюбным», процессу требуется полномочие CAP_SYS_NICE (и следовательно, он должен быть запущен суперпользователем).

Определенным процессам (например, воспроизведению звука) нужно предоставлять процессор вне всякой очереди (упомянутый выше xntpd к таковым не относится). В этих случаях используются атрибуты специальной политики планировщика — SCHED_FIFO (First In-First out scheduling) и SCHED_RR (Round Robin scheduling). Процесс с такими атрибутами ни при каких условиях не может быть прерван обычным. Процессы, планируемые как SCHED_RR и имеющие одинаковый приоритет, периодически все же уступают процессор друг другу, а планируемые как SCHED_FIFO не делают даже этого. Менять политику планировщика позволяет полномочие CAP_SYS_NICE — то же самое, которое нужно для повышения приоритета процесса.

Обычно необходимости вручную управлять планировщиком заданий не возникает. Однако если вы пытаетесь понять, кто «поставил на колени» ваш сервер, имеет смысл, воспользовавшись командой nice, запустить командный интерпретатор с nice value, скажем, -10 или -12.

Другие атрибуты

Процесс можно ограничить в потреблении системных ресурсов, запретив ему использовать память, процессорное время и т. д. сверх определенной нормы. Для этой цели служит специальный набор атрибутов, точнее, два атрибута: «мягкий лимит» (soft limit) и «жесткий лимит» (hard limit). Мягкий лимит — это текущие ограничения, а жесткий — тот максимум, который процесс (не имеющий полномочия SYS_RESOURCE) может запросить у системы.

Кстати, процесс далеко не всегда занимает ту память, которую он занимает. Что это значит? Проще всего показать на примере. Для этого используем простенькую программу test.c (листинг), которая резервирует 100 Мбайт памяти, создает файл длиной 1 Гбайт (его имя передается программе в качестве параметра) и заканчивает работу по нажатию произвольной клавиши. Запустим десять экземпляров этой программы, создав файлы с именами «0»—«9», и посмотрим на состояние процессов, а также на использование памяти и диска (рис. 3). Как легко убедиться, на машине со 128 Мбайт оперативной памяти при выключенной подкачке смогли разместиться десять процессов по 100 Мбайт, а в файловой системе размером 4 Гбайт — десять файлов по 1 Гбайт. Как это могло произойти? Дело в том, что системный вызов malloc только зарезервировал память: реально она была бы отведена процессу тогда, когда он попытался бы ее использовать. И действительно, в памяти каждый процесс занимает менее 1 Мбайт. То же и с файлами: при размере в 1 Гбайт они, как показывает команда du, выдающая информацию об использовании диска, реально занимают на диске по 4 Кбайт.

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

Для организации взаимодействия с файловой системой процессу сопоставлены два каталога — корневой и текущий, а также список открытых файлов и пользовательская маска (umask).

То, что текущий каталог является свойством не системы, а процесса, может удивить разве что знатоков DOS, а для пользователей Windows NT это не является чем-то необычным. Корневой каталог (если он не совпадает с корнем файловой системы) ограничивает множество доступных процессу файлов соответствующим поддеревом: к файлу, лежащему вне поддерева, процесс не может обратиться, даже если на него указывает символическая ссылка (поскольку она будет интерпретирована относительно «корня» процесса — с естественным результатом).

Это часто используется, например, для организации доступа по анонимному ftp: перед тем, как впустить пользователя в систему, ftp-сервер меняет корневой каталог на свой (скажем, /var/state/ftp), и в дальнейшем независимо ни от действий пользователя, ни от ошибок в программе ftpd никакие файлы в самой системе (вне «песочницы» анонимного ftp-сервера) не могут быть повреждены. Как видим, модель безопасности на основе «песочницы», с такой помпой преподнесенная Sun в момент «явления Java народу», весьма давно прозаически используется в Unix, и все ее преимущества и недостатки в общем-то хорошо известны...

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

С каждым процессом связан набор обработчиков сигналов, от которого зависит, как процесс будет реагировать на сигналы, посылаемые другими процессами, в частности, вырабатываемые системой при таких событиях, как нажатие +Z/+C, отключение терминала, уничтожение ведущего процесса сессии и т. д.

Два атрибута процесса хранятся не в особо защищенной области ядра, а вместе с другими данными программы, поскольку их изменение не угрожает безопасности системы. Это параметры командной строки и переменные окружения. Ну и, конечно, есть множество атрибутов, которые не волнуют никого, кроме разработчиков ядра (типа указателя на следующую задачу, имеющую такое же хэш-значение PID, что и текущая).





Окончание в следующем номере.



ОБ АВТОРЕ





Виктор Хименко, e-mail: khim@mccme.ru




Тестовая программа


#include 

int main(int argc,char *argv[]) {
    /* Allocate 100MiB of memory */
    char *p=(char *)malloc(100*1024*1024);
    /* Create file 1GiB in size */
    int fd=creat(argv[1],0666);
    lseek(fd,1024*1024*1024-1,SEEK_SET);
    write(fd,&fd,1);
    close(fd);
    /* Wait */
    getchar();
}


Процессы в системе

Рассказ о жизни процессов естественно начать с самого начала — с их появления на свет. Так вот, процессы размножаются... почкованием: системный вызов Linux, создающий новый процесс, называется clone, а дочерний процесс представляет собой почти точную копию родительского. Только далее он выполняет назначенную ему функцию, а исходный процесс — то, что написано в программе после вызова clone. Потом отличий может стать больше, так что пути-дороги процессов способны разойтись достаточно далеко. Но если нам нужно этому воспрепятствовать, вызов clone позволит задать флаги, указывающие, что порожденный процесс будет иметь со своим предком общие:


  • адресное пространство (CLONE_VM);

  • информацию о файловой системе (CLONE_FS): корневой и текущий каталоги, а также umask;

  • таблицу открытых файлов (CLONE_FILES);

  • таблицу обработчиков сигналов (CLONE_SIGHAND);

  • родителя (CLONE_PARENT) — конечно, в этом случае будет порожден не дочерний, а сестринский процесс.

Нить и задача

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

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

Процесс и программа

Вы скажете: все это замечательно, но если новый процесс — всегда копия существующего, то каким образом в системе ухитряются работать разные программы? И откуда берется самая первая из них?

Процессы, выполняющие разные программы, образуются благодаря применению имеющихся в стандартной библиотеке Unix функций «семейства exec»: execl, execlp, execle, execv, execve, execvp. Эти функции отличаются форматом вызова, но в конечном итоге делают одну и ту же вещь: замещают внутри текущего процесса исполняемый код на код, содержащийся в указанном файле. Файл может быть не только двоичным исполняемым файлом Linux, но и скриптом командного интерпретатора, и двоичным файлом другого формата (например, классом java, исполняемым файлом DOS). В последнем случае способ его обработки определяется настраиваемым модулем ядра под названием binfmt_misc.

Таким образом, операция запуска программы, которая в DOS и Windows выполняется как единое целое, в Linux (и в Unix вообще) разделена на две: сначала производится запуск, а потом определяется, какая программа будет работать. Есть ли в этом смысл и не слишком ли велики накладные расходы? Ведь создание копии процесса предполагает копирование весьма значительного объема информации.

Смысл в данном подходе определенно есть. Очень часто программа должна совершить некоторые действия еще до того, как начнется собственно ее выполнение. Скажем, в разбиравшемся выше примере мы запускали две программы, передающие друг другу данные через неименованный канал. Такие каналы создаются системным вызовом pipe; он возвращает пару файловых дескрипторов, с которыми в нашем случае оказались связаны стандартный поток ввода (stdin) программы wc и стандартный поток вывода (stdout) программы dd. Стандартный вывод wc (как, кстати, и стандартный ввод dd, хотя он никак не использовался) связывался с терминалом, а кроме того, требовалось, чтобы командный интерпретатор после выполнения команды не потерял связь с терминалом. Как удалось этого добиться? Да очень просто: сначала были отпочкованы процессы, затем проделаны необходимые манипуляции с дескрипторами файлов и только после этого вызван exec.

Аналогичного результата (как показывает, в частности, пример Windows NT) можно было бы добиться и при запуске программы за один шаг, но более сложным путем. Что же касается накладных расходов, то они чаще всего оказываются пренебрежимо малыми: при создании копии процесса его индивидуальные данные физически никуда не копируются. Вместо этого используется техника, известная под названием copy-on-write (копирование при записи): страницы данных обоих процессов особым образом помечаются, и только тогда, когда один процесс пытается изменить содержимое какой-либо своей страницы, она дублируется.

Листинг 2. Окончание процедуры инициализации ядра Linux


if (execute_command) 
execve(execute_command,argv_init, envp_init);
execve(?/sbin/init?,argv_init,envp_init);        
execve(?/etc/init?,argv_init,envp_init);        
execve(?/bin/init?,argv_init,envp_init);        
execve(?/bin/sh?,argv_init,envp_init);        
panic(?No init found.  Try passing init= option to kernel.?);}


Первый процесс в системе запускается при инициализации ядра. Пожалуй, даже человеку, не умеющему программировать, достаточно будет взглянуть на конец процедуры инициализации ядра Linux (см. листинг 2), чтобы понять, как определяется выполняемая в этом процессе программа: вначале делается попытка «переключить» процесс на файл, указанный в командной строке ядра (есть и такая...), потом на файлы /sbin/init, /etc/init, /bin/init и напоследок на /bin/sh.

Смерть процесса

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

Обратимся еще раз к примеру, рассмотренному выше. Когда мы нажатием +C принудительно завершили выполнение программ dd и wc, соответствующие процессы были уничтожены, и на экране появилось приглашение командного интерпретатора. Пока программы работали, приглашения не было: интерпретатор находился в состоянии ожидания, в которое перешел, послав специальный системный вызов (в действительности таких вызовов существует несколько: wait, waitpid, wait3, wait4). После окончания работы программ вызов вернул управление интерпретатору, и тот выдал на терминал приглашение.

Если родительский процесс по какой-то причине завершится раньше дочернего, последний становится «сиротой» (orphaned process). «Сироты» автоматически «усыновляются» программой init, выполняющейся в процессе с номером 1, которая и принимает сигнал об их завершении.

Если же потомок уже завершил работу, а предок не готов принять от системы сигнал об этом событии, то потомок не исчезает полностью, а превращается в «зомби» (zombie); в поле Stat такие процессы помечаются буквой Z. Зомби не занимает процессорного времени, но строка в таблице процессов остается, и соответствующие структуры ядра не освобождаются. После завершения родительского процесса «осиротевший» зомби на короткое время также становится потомком init, после чего уже «окончательно умирает».

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

О сигналах

Постойте, но ведь приглашение командного интерпретатора появилось и тогда, когда мы нажали +Z, хотя программы не заканчивали работу, и, следовательно, вызов wait* не мог вернуть управление! Выдача сообщения Stopped (процесс остановлен) и затем приглашения к вводу была реакцией на сигнал CHLD, который ядро посылает при нажатии +Z предкам — в данном случае одному предку — процессов, работающих с терминалом (сами процессы получают свой сигнал).

Сигналы посылаются одними процессами другим с помощью команды, которая носит устрашающее название kill, хотя в общем случае никого не убивает. Все зависит от конкретного сигнала, и практически любой сигнал при необходимости может быть процессом проигнорирован. Исключение составляют KILL, который «без разговоров» уничтожает процесс, и STOP, который его аналогичным образом останавливает.

Правила о том, какой процесс какому имеет право послать сигнал, достаточно сложны. Суперпользователь, очевидно, может посылать сигналы любым процессам, а обычный пользователь — только своим, но здесь есть масса тонкостей: например, нельзя послать сигнал CONT (продолжить выполнение остановленного процесса) своему же процессу, запущенному в другой сессии.

Работа с нитями требует особой техники, поскольку одни сигналы должны «доводиться до сведения» всех нитей, а другие — посылаться индивидуально. В Linux 2.2 это делалось путем довольно хитрых манипуляций со специальной нитью, единственным назначением которой было управление другими нитями. В версии 2.4 ядро может следить за нитями за счет нового флага CLONE_PARENT (таким образом, если одна нить породит другую и закончит работу, то порожденная нить не останется «сиротой») и нескольких специальных правил доставки сигналов, так что надобность в специальной нити отпала.

Компьютерная демонология

Демоном (daemon) в Unix (и в Linux) называется процесс, предназначенный для работы в фоновом режиме без терминала и выполняющий какие-либо действия для других процессов (не обязательно на вашей машине). Обычно демоны тихо занимаются своим делом, и вспоминают о них только в случае каких-либо неполадок в их работе: например, демону начинает недоставать места, и он посылает пользователю сообщение об этом, или демон перестает работать, и вам звонит босс с вопросом, почему у него принтер опять не печатает и когда это прекратится...

На многих машинах демоны, обслуживающие процессы других компьютеров, нужны достаточно редко, так что держать их в памяти постоянно загруженными и транжирить на это ресурсы системы нерационально. Для управления их работой был создан супердемон, которого зовут вовсе не Вельзевулом (в компьютерных демонах вообще мало «демонического» — они ближе демонам Максвелла), а куда скромнее — inetd (что, как вы догадались, является сокращением от Internet daemon).

В конфигурационном файле inetd (/etc/inetd.conf) записано, какой демон обслуживает обращения к какому сервису Internet. Обычно с помощью inetd вызываются программы pop3d, imap4d, ftpd, telnetd (предоставляю читателю определить, какие именно сервисы они обслуживают) и некоторые другие. Эти программы не являются постоянно активными, а значит, не могут считаться демонами в строгом смысле слова, но поскольку они порождаются «полноценным» демоном, их все равно так называют.

Продвинутые средства общения

Процессы посылают друг другу сигналы, передают данные через неименованные и именованные каналы, а также «гнезда». Все это замечательно, но как быть, если один процесс должен передавать другому огромные объемы информации и притом быстро (это нужно, например, при воспроизведении видео)? Могут ли процессы, адресные пространства которых строго разделены, каким-либо образом получить в совместное пользование часть памяти? Да, с помощью временных файлов.

Для передачи обширных массивов данных между процессами служит системный вызов mmap, представляющий собой довольно неожиданное применение страничной виртуальной памяти. Он позволяет, грубо говоря, сказать: «я хочу обращаться к такому-то участку такого-то файла как к оперативной памяти». Данные, которые процесс читает из указанной области памяти, по мере надобности считываются из файла, а те, которые он туда пишет, когда-нибудь попадут на диск. Но процесс сам не работает с диском, этим занимается ядро.

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

Вызов mmap применяется также для «загрузки в память» исполняемых файлов и библиотек, так что если программа использует 25 библиотек общим объемом во много десятков мегабайт, это вовсе не значит, что она и в памяти будет занимать такое же количество мегабайт.

С помощью временных файлов можно, кроме того, синхронизировать работу процессов, используя возможности системы, предназначенные для работы с рекомендательными (advisory) блокировками файлов. Это позволяют сделать системные вызовы fcntl и его более быстрый и простой вариант flock.

Иногда создавать временные файлы нежелательно, поэтому в Linux включены также функции для общения процессов из Unix SVR4 (Unix System V Release 4). Это shmget — создание области памяти для общения процессов, semget — создание семафора, msgget — создание очереди сообщений. В версии 2.4 к ним добавились еще более мощные функции mq_open, shm_open из SUS2 (Single Unix Specification Version 2).

Получение информации о процессах

Для работы с информацией о процессах, которую выводят на терминал программы ps и top, в Linux используется достаточно необычный механизм: особая файловая система procfs. В большинстве дистрибутивов она монтируется при запуске системы как каталог /proc. Данные о процессе с номером 1 (обычно это /sbin/init) содержатся в подкаталоге /proc/1, о процессе с номером 364 — в /proc/364, и т. д. Все файлы, открытые процессом, представлены в виде символических ссылок в каталоге /proc//fd, а ссылка на корневой каталог процесса хранится как /proc//root.

Со временем у файловой системы procfs появились и другие функции. Например, командой

echo 100000 > /proc/sys/fs/file-max

суперпользователь может определить, что в системе разрешается открыть до 100 000 файлов, а команда

echo 0 > /proc/sys/kernel/cap-bound

отнимет у всех процессов в системе все дополнительные права, т. е. фактически лишит систему понятия «суперпользователь».

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

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

ОБ АВТОРЕ

Виктор Хименко, e-mail: khim@mccme.ru





kallypigos: (hybrid)

Файлы, файлы, файлы

Виктор Хименко

Человеку, ранее работавшему с DOS или Windows, при общении с Linux прежде всего бросаются в глаза использование символа `/? вместо ??, отсутствие имен дисков (A:, B:, C: и т. д.) и то, что в именах файлов различаются большие и маленькие буквы. Однако другие особенности, не столь заметные с первого взгляда, более существенны. Давайте посмотрим, как устроена в Linux работа с файлами.

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

Хотя Linux поддерживает более десятка самых разных файловых систем, все «иностранные» (foreign) системы так или иначе маскируются под стандартно используемую в этой ОС ext2fs. Давайте с нее и начнем.

Узлы и каталоги

Во времена юности Unix, когда автор Linux еще не ходил в школу, работа с файлами в этой ОС была организована весьма просто: все файлы на диске нумеровались и для каждого создавалась специальная запись — узел (inode; к сожалению, устоявшегося русского перевода этого термина пока нет), где содержалась служебная информация о файле. Имя в состав этой информации не включалось, а связывалось с узлом с помощью ссылки (link). Ссылки оформлялись как пары вида «имя файла — номер узла» и хранились в каталогах. Каталог можно было читать, как обычный файл, однако для его модификации уже тогда требовалось использовать специальные команды.

Найдя по ссылке в каталоге узел, ядро ОС дальше оперировало с файлом, не обращая никакого внимания на его исходное имя, поскольку все необходимые данные (размер файла, права доступа к нему и т. д.) извлекались уже из узла. С тех пор многое изменилось, однако в файловой системе Linux узлы по-прежнему играют важную роль, а вся информация о файле по-прежнему хранится отдельно от его имени.

Сколько имен у файла?

Описанная схема позволяет связать с одним файлом несколько равноправных имен, что в ряде случаев бывает полезно. Сравните, например, характеристики файлов unzip и zipinfo на рис. 1 и 2 (для получения информации использована программа Midnight Commander).

Рис. 1. Характеристики файла unzip

Как видим, они совпадают: у обоих файлов одно и то же «положение» (кстати, шестнадцатеричное число 1A328h является номером узла), одинаковая длина и т. д., причем на каждый из файлов имеется по две ссылки — это в действительности и есть два имени. Но, будучи физически одним и тем же файлом, unzip и zipinfo являются различными программами: каждая из них выполняет свои действия и имеет собственный набор опций. Никакой мистики здесь нет — просто в программу в качестве нулевого параметра передается ее имя, по которому она и определяет, что делать дальше.

Рис. 2. Характеристики файла zipinfo

Далее, в Unix-системах (включая Linux) нет операции удаления файла в смысле DOS/Windows: есть только удаление ссылки на узел — unlink — и ссылки на пустой каталог — rmdir (в некоторых Unix-системах unlink позволяет удалить ссылку на пустой каталог, но в Linux это не так). Сам же файл удаляется автоматически тогда, когда делается недоступным для системы. Это означает, что не должно остаться, во-первых, ни одной ссылки на него, а во-вторых, ни одной работающей с ним активной программы.

Именно поэтому, кстати, в Linux можно обойтись без перезагрузки практически при любом изменении системы (за исключением замены ядра). Чтобы обновить системную библиотеку, вы стираете ее прежнюю версию (т. е. освобождаете соответствующую ссылку) и записываете под тем же именем новую. Ядро откладывает момент удаления библиотеки до тех пор, пока не закончит работу последняя из программ, ее использующих (что может произойти много месяцев спустя). Это весьма удобно, но если не знать о таком поведении системы, можно попасть в неприятную ситуацию.

Монтирование

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

Чтобы избежать подобных эффектов, любую файловую систему необходимо перед началом работы с ней в явной форме подключить к ОС (смонтировать — mount), а по окончании отключить (размонтировать — unmount). Для этой цели служат команды mount и umount (без n, хотя соответствующее действие называется unmount). Команда mount имеет множество опций (см. врезку «Монтирование: подробности для любознательных»), но обязательных аргументов у ее стандартного варианта два: имя файла блочного устройства и имя каталога. В результате выполнения этой команды файловая система, расположенная на указанном устройстве, подключается к системе таким образом, что ее содержимое заменяет собой содержимое заданного каталога (поэтому для монтирования обычно используют пустой каталог). Команда umount выполняет обратную операцию — отсоединяет файловую систему, после чего накопитель можно извлечь и положить на полку (на самом деле проблемы возникают почти исключительно с дискетами: CD-ROM, магнитно-оптический диск или Zip-диск, который забыли размонтировать, просто не удастся вытащить без помощи скрепки — он блокируется).

Такие разные файлы

Осталось выяснить, что такое файл блочного устройства. Для этого следует рассказать о том, какие вообще «звери» встречаются в файловой системе. Очевидно, там есть обычные файлы и каталоги, но это далеко не все. Файлами с точки зрения Linux являются также:


  • символьные устройства;

  • блочные устройства;

  • именованные каналы (named pipes);

  • гнезда (sockets);

  • символьные ссылки (symlinks).

Все эти «звери» в чем-то похожи на обычные файлы, а в чем-то отличаются от них (во всяком случае, все они могут быть удалены системным вызовом unlink, что сближает их с обычными файлами и отдаляет от каталогов). Рассмотрим их по порядку.

Символьные и блочные устройства

Файлы символьных и блочных устройств создаются с помощью программы mknod и соответствуют внешним устройствам, а также псевдоустройствам, таким как знаменитое пустое устройство /dev/null (такое, при попытке чтения из которого сразу же сообщается о достижении конца файла и при записи в которое никогда не происходит переполнения — точный аналог NUL в DOS/Windows).

Устройства нумеруются двумя целыми числами — старшим (major number) и младшим (minor number). Первое из них соответствует типу устройства (например, для устройств, подключенных к первому IDE-контроллеру, оно равно 3, для подключенных ко второму — 22 и т. д.), а второе — конкретному устройству (например, для мастер-диска, подключенного к первому IDE-контроллеру, оно равно 0, для первого раздела на этом диске — 1 и т. д.). При этом символьные и блочные устройства нумеруются независимо.

Число 30Ah в поле «положение» информации о файлах /usr/bin/unzip и /usr/bin/zipinfo на рис. 1 и 2 обозначает как раз номер устройства: 3 — это первый IDE-диск, а 0A — его десятый раздел.

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

Многие устройства имеют дополнительные характеристики: скажем, на консоли (виртуальной) IBM PC есть три лампочки — Num Lock, Caps Lock и Scroll Lock, — а последовательный порт может передавать данные с различной скоростью. Как правило, программы в Linux работают просто с файлами, никак или почти никак не учитывая особенности того или иного конкретного устройства. Если же программа должна их учитывать, она осуществляет управление соответствующими параметрами через системный вызов ioctl, позволяющий, например, зажечь Num Lock или изменить громкость звука. В основном использование ioctl сводится к управлению конфигурацией (отсюда и название — I/O ConTroL, т. е. управление вводом-выводом).

Основной недостаток описанной схемы в том, что она плохо масштабируется: различных устройств существует великое множество, и поскольку всякое устройство, потенциально подключаемое к компьютеру, должно получить номер (а многие — несколько номеров), этих самых номеров явно не хватает. Кроме того, хотя в каталоге /dev, где традиционно хранятся файлы устройств, представлен, разумеется, далеко не весь спектр аппаратуры (только для SCSI-устройств потребовалось бы завести не одну тысячу файлов), он все-таки обычно содержит более тысячи файлов, и лишь очень малая их часть соответствует устройствам (или псевдоустройствам), реально присутствующим в системе.

Эта проблема была осознана достаточно давно, и уже предложено несколько вариантов ее решения. Однако самым распространенным остается пока стандартный подход, когда все файлы устройств создаются вручную программой mknod. Мне представляется наиболее удачным вариант с использованием специальной файловой системы devfs, монтируемой в каталог /dev, в которой специальные файлы устройств создаются и уничтожаются автоматически по мере надобности (именно так настроен компьютер, где сейчас пишутся эти строки).

Именованные каналы

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

Гнезда

Вообще гнезда (и взаимодействие программ при помощи гнезд) играют очень важную роль во всех Unix-системах, включая и Linux: они являются ключевым понятием TCP/IP и соответственно на них целиком строится Internet. Однако c точки зрения файловой системы гнезда практически неотличимы от именованных каналов: это просто метки, позволяющие связать несколько программ. После того как связь установлена, общение программ происходит без участия файла гнезда: данные передаются ядром ОС непосредственно от одной программы к другой*.

Символические ссылки

Символическая ссылка — относительно новое понятие в Unix. Это особый файл с информацией о том, что требуемый файл в действительности находится в другом месте, и о том, где именно его искать. Например, файл /usr/bin/gzip представляет собой символическую ссылку, указывающую на файл /bin/gzip; благодаря ей можно использовать /bin/gzip, обращаясь к нему как к /usr/bin/gzip. Близким аналогом символических ссылок являются ярлыки Windows 9X и NT 4.0, но ярлыки интерпретируются Проводником Windows, а символические ссылки — непосредственно ядром ОС.

В отличие от обычной, или, как еще говорят во избежание путаницы, жесткой ссылки, символическая ссылка может указывать на файл из другой файловой системы (например, находящийся на другом диске). Заметим, что при создании жесткой ссылки мы получаем два равноправных объекта (при удалении файла /usr/bin/unzip файл /usr/bin/zipinfo будет работать по-прежнему), а вот символическая ссылка при удалении (или переименовании/перемещении) объекта, на который она указывает, «провисает» и становится неработоспособной.

Во второй части статьи мы рассмотрим права доступа к файлам и работу Linux с другими файловыми системами.

Окончание в следующем номере.

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

назад


Монтирование: подробности для любознательных

Как уже было сказано, монтирование файловых систем выполняется командой mount, а их размонтирование — командой umount. Исключение составляет корневая файловая система*, которая обслуживается отдельно и до всех остальных систем. Действительно, только при ее наличии становятся доступными и сама команда mount, и каталог /dev, где находятся файлы устройств, и подкаталоги для монтирования. Чтобы файловые системы можно было монтировать при запуске ОС и размонтировать при ее остановке, используются два файла, которые традиционно размещаются в подкаталоге /etc: /etc/fstab и /etc/mtab.

Файл /etc/fstab содержит список файловых систем, которые могут быть смонтированы. Конечно, необходимые параметры всегда можно указать при вызове команды mount, но гораздо удобнее, когда они извлекаются из файла. Содержимое моего файла /etc/fstab показано на рис. 3. Каждой точке монтирования в нем соответствует одна строка, состоящая из шести полей: название устройства, на котором расположена файловая система, точка монтирования, тип файловой системы, параметры монтирования, «уровень дампа» и порядковый номер файловой системы для программы fsck. Рассмотрим эти поля по порядку.

Рис. 3. Пример файла fstab
Название устройства

Чаще всего в этом поле задается имя блочного устройства, на котором размещена файловая система, но так бывает не всегда: для файловой системы procfs, дающей доступ к внутренним структурам ядра, здесь может находиться любой текст (в примере — слово none), для сетевой файловой системы указывается имя сервера и подкаталога на нем и т.д. Даже для обычных файловых систем данное поле иногда содержит нечто отличное от имени устройства: скажем, в трех последних строках моего файла /etc/fstab это имена файлов с образами дисков CD-ROM. Кроме того, разрешается указать вместо имени устройства метку диска или его серийный номер, например:

LABEL=temp /tmp ext2 defaults 1 2 UUID=3a30d6b4-08a5-11d3-91c3-e1fc5550af17 /usr ext2 defaults 1 2

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

Точка монтирования

Поле со вполне, казалось бы, очевидным значением, но пара маленьких подвохов все-таки имеется. Во-первых, при автоматическом монтировании файловые системы монтируются в том порядке, в каком они перечислены в /etc/fstab, и если, например, файловая система /home у вас находится на отдельном диске, а /home/ftp — еще на одном диске, то строка с описанием /home должна стоять в /etc/fstab до строки с описанием /home/ftp. Во-вторых, для раздела (или файла) подкачки данное поле никак не используется, и его содержимое может быть любым — лишь бы оно вообще присутствовало (этого требует формат файла).

Тип файловой системы

Уж здесь-то какие могут быть подвохи? Их и нет. Почти. Можно задать в этом поле значение auto, и тогда команда mount попытается сама определить тип файловой системы. Это не так уж замечательно, как может показаться: тип файловой системы определяется путем проверки так называемого «магического числа», которая срабатывает далеко не всегда, а кроме того, перебираются только файловые системы, которые поддерживаются ядром в данный момент (они перечислены в файле /proc/filesystems). Иначе говоря, если у вас имеется дискета с файловой системой minix, а ни одного раздела с этой системой не смонтировано, то при явном задании типа в память будет загружен модуль с файловой системой minix и дискета смонтируется, а при указании типа auto этого, скорее всего, не произойдет и смонтировать дискету не удастся.

Параметры монтирования

Это поле обладает одной весьма неприятной особенностью: часть задаваемых в нем параметров интерпретируется командой mount, а часть — ядром системы. Параметры, интерпретируемые ядром, различны в зависимости от файловой системы и версии ядра (некоторые из них будут рассмотрены в разделе, посвященном «иностранным» файловым системам), а команда mount интерпретирует следующие параметры:


  • async — весь ввод-вывод осуществляется асинхронно;

  • atime — изменять параметр «время доступа» при обращении к файлам (по умолчанию);

  • auto — система может быть смонтирована при автоматическом монтировании;

  • defaults — установки по умолчанию: rw + suid + dev + exec + auto + nouser + async;

  • dev — система может содержать файлы блочных и символьных устройств;

  • exec — она может содержать исполняемые файлы;

  • loop — для размещения системы можно использовать обычный файл (стандартно файловые системы размещаются на устройствах, к каковым обычные файлы не относятся, но если указать параметр loop, программа mount находит свободное loop-устройство, «связывает» с ним с помощью программы losetup заданный файл и передает имя этого устройства системному вызову mount; именно так монтируются образы CD-ROM в трех последних строках моего файла fstab);

  • noatime, noauto, nodev, noexec, nosuid, nouser — параметры, противоположные по значению соответствующим параметрам без «no-»;

  • remount — повторно смонтировать уже смонтированную файловую систему (например, чтобы сменить параметры монтирования);

  • ro — смонтировать файловую систему только для чтения;

  • rw — смонтировать файловую систему для чтения и записи (установка по умолчанию);

  • suid — разрешить интерпретацию битов SUID и SGID (подробнее мы рассмотрим их в разделе, посвященном правам доступа);

  • sync — весь ввод-вывод осуществляется синхронно;

  • user — обычный пользователь (не суперпользователь) наделяется правом монтировать и размонтировать данную файловую систему; этот параметр влечет за собой noexec, nosuid и nodev, если после него явно не указано exec, dev или suid.

«Уровень дампа»

Это поле — самое мистическое в /etc/fstab. Оно используется программой dump, предназначенной для создания резервных копий. Если файловая система должна участвовать в процессе резервного копирования, то здесь должно стоять число 1, если нет — 0 (в действительности возможны и другие значения, но чтобы объяснить их смысл, пришлось бы вникать в тонкости работы программы dump).

Порядковый номер файловой системы для программы fsck

Перед автоматическим монтированием во время загрузки ОС файловая система тестируется программой fsck, которая проверяет ее целостность и, если необходимо, исправляет простейшие ошибки. Чтобы ускорить этот процесс, можно запустить fsck параллельно для нескольких файловых систем. Однако параллельно обрабатываемые системы должны находиться на разных дисках, иначе вместо ускорения обработки мы получим замедление, ибо диск будет непрерывно получать запросы на чтение разных его участков. Значение, установленное в данном поле, позволяет влиять на последовательность проверки: если присвоить файловым системам одинаковые номера, они будут проверяться одновременно. Системы, для которых этот параметр установлен в 0, не проверяются вообще. Для корневой файловой системы его значение несущественно.

Если в файле /etc/fstab имеется строка, относящаяся к данной файловой системе, то при вызове для нее программы mount можно опустить параметры монтирования, название устройства или точку монтирования. Этот файл используется также в графических оболочках, таких как KDE, где монтирование файловой системы сводится к щелчку мышью.

Программа amd и особая файловая система autofs позволяют сделать так, чтобы файловая система автоматически монтировалась при «заходе» в специальный каталог и размонтировалась через некоторое время после того, как последняя программа перестанет использовать файлы из нее. Однако это достаточно рискованно при работе с обычными дисководами гибких дисков: если по ошибке вынуть дискету из дисковода в тот момент, когда она смонтирована, можно серъезно разрушить файловую систему на ней.

В файле /etc/mtab хранится информация о том, какие файловые системы сейчас смонтированы и с какими параметрами монтирования это было сделано. Данные о смонтированных файловых системах содержатся также в файле /proc/mounts (и там они точнее, поскольку отображают соответствующую внутреннюю таблицу ядра), но параметров, с которыми эти системы были смонтированы, в нем нет, поскольку они в ядре не хранятся (а те из них, которые интерпретируются программой mount, вообще не доходят до ядра), поэтому /etc/mtab также находит применение.



*Другое исключение — специальная файловая система devfs, содержащая файлы устройств.

Права доступа

Теперь, когда мы выяснили, какие объекты встречаются в файловой системе, полезно вспомнить, что Linux, подобно другим Unix-системам, является многопользовательской ОС, а значит, доступ к файлам должен ограничиваться: вряд ли вы будете в восторге, если все пользователи машины смогут читать ваши любовные письма...

Пользователи и группы

Стандартная система прав доступа в Linux, пришедшая все из тех же далеких 70-х, весьма проста и логична, хотя и не всегда удобна*. Ее базовые понятия — пользователь и группа. Каждый зарегистрированный в системе пользователь получает уникальный номер-идентификатор. Кроме того, он должен входить хотя бы в одну группу, которая является для него «главной», и может входить в другие — «дополнительные» (supplementary groups). Все группы также перенумерованы. Файл всегда связан с определенным пользователем — своим владельцем — и с определенной группой, т. е. у него есть UID (User ID, идентификатор пользователя) и GID (Group ID, идентификатор группы). Изменять права доступа к файлу разрешено только его владельцу. Изменить владельца файла может суперпользователь, группу — суперпользователь или владелец файла (см. рис. 1).

Рис. 1. Midnight Commander: изменение владельца и группы файла с помощью команды chown

Программа, выполняющаяся в системе, всегда запускается от имени какого-то пользователя и какой-то группы (обычно — основной группы этого пользователя), но связь процессов с пользователями и группами организована сложнее: здесь различаются идентификатор для доступа к файловой системе (FSUID — File System access User ID, FSGID — File System access Group ID) и эффективный идентификатор (EUID — Effective User ID, EGID — Effective Group ID), а при доступе к файлам учитываются еще и полномочия (capabilities), присвоенные самому процессу. Соответствующие механизмы мы разберем, когда будем рассматривать управление процессами.

При создании файл получает UID, совпадающий с FSUID процесса, который его создает, и, как правило, GID, совпадающий с FSGID этого процесса; об исключении будет сказано чуть ниже.

Атрибуты доступа

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

Атрибуты определяют, что разрешено делать с данным файлом данной категории пользователей. Каков же набор возможных операций в Linux (и — шире — в Unix)? Оказывается, их всего три: чтение, запись и выполнение. Как же, спросите вы, быть, например, с созданием и удалением файлов? И как можно выполнить каталог?

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

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

Помимо трех названных основных атрибутов доступа существуют дополнительные, используемые в особых случаях. Наиболее важные из них — SUID, SGID и SVTX.

Атрибуты SUID и SGID существенны при запуске программы на выполнение: они требуют, чтобы программа выполнялась не от имени запустившего ее пользователя (группы), а от имени владельца (группы) того файла, в котором она находится. Выражаясь более формально, если файл программы имеет атрибут SUID (SGID), то FSUID и EUID (FSGID и EGID) соответствующего процесса не наследуются от процесса, запустившего его, а совпадают с UID (GID) файла. Благодаря этому «рядовые» пользователи получают, например, возможность запустить системную программу, которая создает свои рабочие файлы в закрытых для них каталогах.

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

Атрибут SVTX (называемый также sticky bit, т. е. бит-липучка) в эпоху молодости Unix определял, нужно ли выгружать программу из памяти по окончании ее выполнения, однако сейчас от ручного управления выгрузкой отказались. Зато SVTX приобрел новое значение применительно к каталогам: из каталога, имеющего этот атрибут, ссылку на файл может удалить только владелец файла. SVTX применяется в первую очередь в каталоге /tmp, где хранятся временные файлы: создать там файл может любой пользователь системы, а удалить — только тот, кто его создал (и, разумеется, суперпользователь).

Запись прав доступа

Существуют две стандартных формы записи прав доступа — символьная и восьмеричная. Символьная представляет собой цепочку из десяти знаков, первый из которых не относится собственно к правам, а обозначает тип файла (?-? — обычный файл, ?d? — каталог, ?c? — символьное устройство, ?b? — блочное устройство, ?p? — именованный канал, ?s? — «гнездо», ?l? — символическая ссылка). Далее следуют три последовательности, каждая из трех символов, соответствующие правам пользователя, группы и всех остальных. Наличие права на чтение обозначается буквой ?r?, на запись — ?w? на выполнение — ?x?, отсутствие какого-либо права — знаком ?-? в соответствующей позиции. Наличие атрибута SUID (SGID) обозначается буквой ?S? в позиции права на выполнение для владельца (группы), если выполнение не разрешено, и буквой ?s?, если разрешено. SVTX записывается соответственно буквой ?T? или ?t? в позиции права на выполнение для «посторонней публики».

Восьмеричная запись — шестизначное число, первые два знака которого обозначают тип файла и довольно часто опускаются, третий — атрибуты GUID (4), SGID (2) и SVTX (1), а оставшиеся три — соответственно права владельца, группы и всех остальных: чтение — 4, запись — 2, выполнение — 1.

Например, стандартный набор прав доступа для каталога /tmp в символьной форме выглядит как drwxrwxrwt, а в восьмеричной как 041777 (это каталог; чтение, запись и поиск разрешены всем; установлен атрибут SVTX). А набор прав -r-S—xw—, или 102412, будет означать, что это обычный файл, владельцу разрешается читать его, но не выполнять и не изменять, пользователям из группы файла (за исключением владельца) — выполнять (причем во время работы программа получит права владельца файла), но не читать и не изменять, а всем остальным — изменять, но не читать и не выполнять. Пример, конечно, условный: трудно вообразить себе ситуацию, в которой действительно потребовалось бы назначить файлу подобные права доступа.

А вот несколько более реалистичный пример. Вообразим себе, что среди пользователей некой машины имеется группа «писателей», которые сочиняют коллективную монографию, и группа «читателей», которые по ходу написания читают ее и высказывают свои замечания. Пользователям, не входящим ни в одну из этих групп, материалы должны быть недоступны. На первый взгляд кажется, что здесь мы натыкаемся на ограниченность системы прав Linux: у файла (или каталога) может быть только один GID.

Однако выход достаточно прост: если сформировать группы так, чтобы список «писателей» был включен в список группы «читателей» (что вполне логично — только в анекдоте чукча может быть писателем, не будучи читателем), то нужного результата можно добиться с помощью иерархии из двух каталогов:


d—-r-x—- /readers UID=0,
GID=
d—-rwsr-x /readers/writers
UID=0, GID=



Все файлы размещаются в каталоге /readers/writers. Модифицировать их разрешено «писателям», а читать всем, но реально добраться до этого каталога смогут только те, у кого есть право на выполнение каталога /readers, т. е. «читатели».

Большинство программ создают файлы с разрешением на чтение и запись для всех пользователей, а каталоги — с разрешением на чтение, запись и поиск для всех пользователей. Этот исходный набор атрибутов логически складывается с «пользовательской маской» — user file-creation mask, сокращенно umask, которая обычно ограничивает доступ. Так, для описанного только что примера значение umask должно быть u=rwx,g=rwx,o=rx, т. е. у владельца и группы остается полный набор прав, а всем остальным запрещается запись. В восьмеричном виде оно запишется как 002 (первый знак — ограничения для владельца, второй — для группы, третий — для остальных, запрещение чтения — 4, записи — 2, выполнения — 1).

В дальнейшем владелец файла может изменить права доступа к нему командой chmod, а если он не хочет разбираться с запутанным синтаксисом команды, то с помощью какой-либо из многочисленных программ-оболочек (например, Midnight Commander — см. рис. 2).

Рис. 2. Midnight Commander: изменение прав доступа к файлу

Новые пользователи часто не могут понять, в чем разница между атрибутами «время модификации» (modification time) и «время изменения» (change time). В действительности первое соответствует тому моменту, когда в последний раз изменялось содержимое файла, а второе — тому, когда изменялись его характеристики, например ссылки или права доступа.

Об именах

Вернемся теперь к именам файлов. Как уже говорилось, они не очень важны с точки зрения Linux и вообще Unix: например, существует функция системной библиотеки, которая создает и сразу же «удаляет» файл со случайным именем, после чего возвращает ссылку на него. Ставший безымянным файл продолжает существовать до окончания использования, так что программа получает в свое распоряжение файл, к которому нельзя обычным образом обратиться извне. Однако с точки зрения пользователя имя все-таки представляет собой довольно существенный параметр файла.

Какие же ограничения накладываются на имена файлов? Их немного — поразительно немного для людей, работавших ранее с другими ОС:


  • имя файла не должно содержать символов ?? (символ с кодом 0) и ?/?;

  • имя файла не должно быть длиннее 255 символов;

  • полный путь к файлу должен быть не длиннее 4096 символов.

Это все. Причем есть способ добраться и до файла, путь к которому оказался слишком длинным; мы расскажем о нем в связи с процессами.

Вся система прав доступа NTFS в Linux игнорируется, и доступ к файлам регулируется так же, как для FAT. Правда, если указать параметр posix=yes, можно будет увидеть все имена файлов — и короткие, и длинные. Заодно это позволит увидеть файлы с именами, отличающимися только регистром символов. Откуда они берутся? Дело в том, что в Windows NT есть подсистема POSIX, внутри которой различаются большие и маленькие буквы, есть возможность создавать жесткие ссылки и т. д. Она иногда используется при переносе программ из Unix в Windows NT.

В Linux поддерживается еще много файловых систем (HFS, HPFS и др.), но они реже встречаются на практике, и исследование их особенностей я оставляю читателю. Сетевые файловые системы — coda, smbfs, nсpfs и nfs — мы рассмотрим позже, когда перейдем к работе Linux в сети.

Об авторе

Виктор Хименко, e-mail: khim@sch57.msk.ru

Окончание. Начало см. в «Мире ПК», № 2/2000, с. 64.


* Сейчас предпринимаются попытки заменить систему прав доступа в Linux на другую, более гибкую, но в ядре 2.4 она, видимо, останется прежней.


** Что касается звуковых компакт-дисков, то работа с ними как в Windows, так и в Linux осуществляется специальными программами и не требует поддержки со стороны файловой системы. Для Linux разработана также файловая система audiofs (http:// fly.cc.fer.hr/~ptolomei/ audiofs/), в которой данные на звуковых CD представляются как нормальные файлы, однако она не включена в стандартное ядро.

kallypigos: (hybrid)
Сегодня случайно узнала, что украинский фантаст Сергей Киселев (которого я "открыла", как сама считала и как свято верят мои знакомые), оказывается, был сыном Владимира Киселева (автора "Девочки и птицелета", "Только для девочек", "Любви и картошки") и, соответственно, братом великого Леонида Киселева.

Все они умерли уже.

Похоже, украинские повести С. Киселева по-русски не выходили. Так же как очень долго не выходила книжным изданием "Только для девочек" его отца. Природа цензуры разная, но результат один.

"Только для девочек" и сегодня отсутствует в электронном виде.
kallypigos: (fox_high)
Пятнадцать лет сайту, на котором расположен крупнейший, популярнейший и толковейший из русскоязычных «Буддийский форум». Отметим и тридцатник! :)
kallypigos: (hybrid)
infographic_debian-ru-v1-0
Огромное (5250х3250 точек) наглядное пособие с изображением жизненного цикла ОС "Дебиан".
Via http://claudiocomputing.wordpress.com
kallypigos: (Chinese)
Итак, основное достижение каникул: холера развивается нормально проведено регресс-тестирование Debian 7.0RC1 на всех учебных конфигурациях. Вкратце: ничего не поломалось, что вообще-то удивительно.
С понедельника, 1 апреля (но это не шутка) во всех классах она доступна в меню мультизагрузки через пункты "Debian GNU/Linux Wheezy RC1" и "Debian GNU/Linux Wheezy RC1/X-Window" с обычными реквизитами и профилями. Загрузка чисто сетевая, поэтому может подтормаживать при одновременной загрузке нескольких машин из класса. Конфигурационные файлы Squeeze и Wheezy разведены хитрым образом, опишу, если будет время, но суть в том, что настройки XFCE и GNOME различные (поскольку различны их версии), но при первой регистрации в новой системе все, что можно, подхватывается из старой), а большинства прикладных программ --- общие. KDE и пр., как и раньше, доступно, но нами не поддерживается.
1 июля с.г. мы намерены сделать загрузку Wheezy строкой по умолчанию, вне зависимости от того, получит ли 7.0 к этой дате статус стабильного релиза.
К 1 сентября с.г. мы намерены удалить Squeeze из меню мультизагрузки учебных мест. Если некоторые технические затруднения будут решены, в классах 23 и 24 при этом заодно могут быть удалены и локальные винчестеры, т.е. все классы 22--25 станут единообразными, прямоугольными и окрашенными бездисковыми. Еще есть хороший шанс получить коробку процессоров и сделать один из этих классов 64-разрядным. (Здорово было бы получить две и избавиться от 32-битной системы в учебном процессе вообще, но в бюджет не заложено, а меценатов нет. Впрочем, если бы продать полсотни б/у P4 Prescott (SL8HX, SL7PR, SL7PW) хотя бы по $15 (эквивалентом, налом или безналом), мы бы почти уложились, но это утопия.).
Tags:
kallypigos: (colored)
"Робкие попытки законодателей немного ограничить поток дезинформации и порнографии".

На самом деле, антивирусятничество не остается безнаказанным в плане мозгового здоровья. Один месяц по Гватемале бегает, другой хочет Интернет только членам профсоюза, третий томат робкий пингвин вообще.
Mar. 24th, 2013 09:50 am

Ого!

kallypigos: (Hilda)
anndr

Курильщик неожиданный и Габи неожиданная :)
kallypigos: (hybrid)
Еще о «ламстве» и «буддоламаизме». Весьма подробная статья об истории вопроса:
Цыремпилов Н.В. «Зловредное суеверие» или «лучшая из языческих религий»? Буддизм в православной публицистике XIX – начала XX вв. // Религиоведение №4, 2012. С. 132—146.
Via Ольга.
kallypigos: (Chinese)
Три года назад Институт философии РАН представил заключение на учебник "Основы буддийской культуры" с такой сказочной формулировкой:


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

Видеть слово "ламаизм", употребленное всерьез в XXI в., достаточно странно. Его придумали, судя по всему, немецкие ориентологи середины XIX в., не слишком разбиравшиеся в тибетских учениях (в них тогда никто не разбирался). По мере развития в западных странах (включая Россию) синологии, тибетологии и буддологии оно постепенно выходило из употребления. Кажется, после II мировой войны его практически нет в специально буддологической литературе, а с 60--70-х. гг. в научной литературе вообще. А вот в советской и китайской пропагандистской литературе оно использовалось вовсю. Обычный подтекст: "Буддизм у нас, может, и культурное наследие, а вот ламаизм --- это у немытых тибетцев суеверия какие-то, живут в лесу, молятся колесу ламе".

Помимо дерогативного оттенка, "ламаизм" еще и предельно неконкретен. Я привыкла (по словарю Брокгауза--Ефрона), что оно относится специально к нам, Желтым Шапкам, гелугпа:

Ламаизм — самая распространенная из позднейших сект буддизма, исповедуемая ныне в Китае обывателями Тибета, Тангута, Кукунора, Алашани, всей Монголии и бывшей Чжунгарии, а в России — бурятами, некоторыми тунгусами и калмыками. Во всех этих странах Ламаизм известен еще под именем "желтошапочного учения", или, короче, "желтой веры". Основатель Ламаизма, Цзонкава, впервые и открыто начал свою проповедь в 1409 г., но развитие Ламаизма завершилось к середине XVI в. В Европе основы Ламаизма неизвестны вовсе и все европейские корифеи буддизмоведения относятся к нему презрительно, предполагая, что Ламаизм "едва ли" заслуживает внимания сам но себе, и называя его "искажением" (the corrupt form) буддизма.


Однако, в БСЭ-3 читаем:

Ламаизм, одно из течений в буддизме; распространено в автономных районах Тибет и Внутренняя Монголия (КНР), МНР, а также в отдельных районах Непала и Индии. В СССР Л. имеет некоторое число последователей в Бурятской АССР, Калмыцкой АССР и Тувинской АССР, Усть-Ордынском и Агинском Бурятских национальных округах. Процесс складывания Л. начался в Тибете, куда буддизм в форме Махаяны проник из Индии в 7 в., одновременно с созданием там первого единого государства (7—9 вв.)..


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

Подписавшая отзыв ИФАН Н.А. Канаева, наверное, имеет в виду под "ламаизмом" тибетский буддизм вообще. Это замечание по отношению к учебнику покойного Бабу-ламы (В.Л.Чимитдоржиева) несправедливо: там, где это уместно по жанру и адресату книги, он оговаривает специфически махаянские, специфически тибетские или специфически гелугские моменты.

Другие замечания Канаевой (эпистемолога и логика, а не буддолога, и индолога, а не синолога или тибетолога) касаются, по сути, терминологии:

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

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

До сих пор считалось, что Будда Шакъямуни запрещал записывать дхарму на санскрите из-за браминов. Но возможно, он на самом деле провидел советских санскритологов, путающих "майтри" с "каруной".
kallypigos: (Chinese)
Алгебра
1. Сборник задач по алгебре. 6-7 класс. Часть I (П.А. Ларичев. 1958 год) (2.7 МБ)
2. Алгебра. Учебник для 6-8 классов (А.Н. Барсуков. 1966 год) (2.4 МБ)
3. Алгебра. 6 класс (Ю.Н. Макарычев. 1974 год) (5.9 МБ)
4. Алгебра. 6 класс (Ю.Н. Макарычев. 1985 год) (5.9 МБ) (6.1 МБ)
5. Дидактические материалы по алгебре. 6 класс (М.Р. Леонтьева. 1982 год) (3.9 МБ)
6. Алгебра. 7 класс. (Ю.Н. Макарычев. 1976 год) (5.3 МБ)
7. Алгебра. 9 - 10 класс. (Н.Я. Виленкин. 1968 год) (3.9 МБ)
8. Алгебра и начала анализа. 9 - 10 класс (А.Н. Колмогоров. 1987 год) (7.3 МБ)
9. Алгебра и элементарные функции. 9 класс. (Е.С. Кочетков. 1969 год) (5.8 МБ)
10. Алгебра и начала анализа. 10 -11 класс. (А.Н. Колмогоров. 1990 год) (3.4 МБ)
11. Алгебра и элементарные функции. 10 класс. (Е.С. Кочетков. 1967 год) (4.6 МБ)
12. Повторяем и систематизируем школьный курс алгебры и начал анализа. (В.С. Крамор. 1990 год) (5.1 МБ)
13. Вопросы преподавания алгебры и начал анализа в средней школе (Е.Г. Глаголева. 1981 год) (4.1 МБ)
14. Алгебра и начала анализа. 10 -11 класс. (А.Н. Колмогоров. 1990 год) (13.1 МБ)

Астрономия

1. Астрономия. 10 класс. (Б.А. Воронцов-Вельяминов. 1983 год) (3.6 МБ)
2. Астрономия. Учебник для средней школы. (Б.А. Вонцов-Вельяминов. 1966 год) (4.7 МБ)
3. Сборник задач по астрономии. (Б.А. Вонцов-Вельяминов. 1980 год) (920.9 КБ)

Биология
1. Биология. 6 - 7 класс. (В.А. Корчагина. 1993 год) (14 МБ)
2. Человек. Анатомия. Физиология. Гигиена. 8 класс. (А.М. Wepvth/ 1979 год) (5.9 МБ)
3. Общая биология. 9 - 10 класс. (Ю.И. Полянский. 1987 год) (5.9 МБ)
4. Общая биология. 10 - 11 класс. (Д.К. Беляев. 1991 год) (5.2 МБ)
5. Энциклопедический словарь юного биолога. (М.Е. Аспиз. 1986 год) - пароль: Русичи Книги

Ботаника
1. Ботаника. 5 - 6 класс. (В.А. Кочагин. 1985 год) (6.3 МБ)
2. Ботаника. Для техникумов. (В.Г. Хржановский. 1988 год) (11.8 МБ)
3. Ботаника. Морфология и анатомия растений. (А.Е. Васильев. 1988 год) (10.9 МБ)
4. Школьный Атлас - определитель высших растений. (В.С. Новиков. 1991 год) (10.2 МБ)

Чтение

1. Азбука. 1 класс. (1983 год) - пароль: Русичи Книги
2. Букварь. 1 класс. (1952 год) (3.8 МБ)
3. Букварь. 1 класс. (1952 год) цветной (3 МБ)
4. Букварь. 1 класс. (1959 год) (3 МБ)
5. Букварь. 1 класс. (1962 год) (4.8 МБ)
6. Букварь. 1 класс. (1970 год) (3.6 МБ)
7. Родная речь. 1 класс (1963 год) (3.4 МБ)
8. Антирелигиозная азбука. (1933 год) (769.4 КБ)
9. Родная речь. 1 класс. (1963 год) - пароль: Русичи Книги
10. Букварь. 1 класс. (1987 год) - пароль: Русичи Книги
11. Азбука. 1 класс. (1983 год) - пароль: Русичи Книги
12. Букварь. 1 класс. (1959 год) - пароль: Русичи Книги

Физика
1. Физика для старших классов и подготовки в ВУЗ. 3 части. (Г.С. Ландсберг. 1985 год) - пароль: Русичи Книги
2. Физика. Учебное пособие для учащихся 7 - 11 классов. (О.Ф. Кабардин. 1991 год) (5 МБ)
3. Физика. 7 класс. (А.В. Перышкин. 1989 год) (3 МБ)
4. Сборник задач по физике для 8 - 10 классов. (В.П. Демкович. 1981 год) (6.8 МБ)
5. Физика. 9 класс. (Б.Б.Буховцев. 1981 год) (3.9 МБ)
6. Физика. Факультативный курс. 9 класс. (О.Ф. Кабардин. 1978 год) (3 МБ)
7. Физика. 9 класс. Основы кинематики и динамики. Законы сохранения в механике. (И.К. Кикоин) (2.9 МБ)
8. Физика. Факультативный курс. 10 класс. (О.Ф. Кабардин. 1987 год) (1.9 МБ)
9. Физика для средних специальных учебных заведений. (Л.С. Жданов. 1984 год) (4.9 МБ)
10. Курс физики для ВУЗов. (Т.И. Трофимова. 1990 год) (12.3 МБ)
11. Основы оптики. (М. Борн, Э. Вольф. 1973 год) (17.9 МБ)
География
1. География. 8 класс. ( Н.Н. Баранский. 1933 год) (6.5 МБ)
2. Географический Атлас. Мир и Человек. (1988 год) (7 МБ)
3. Географический Атлас. Мир вокруг нас. (1991 год) (8.2 МБ)
4. Очерки по истории географических открытий в пяти томах. (1982 - 1986 г.г.) - пароль: Русичи Книги
5. География. 8 класс. ( Н.Н. Баранский. 1933 год) - пароль: Русичи Книги
Геометрия
1. Сборник задач на геометрические преобразования. 5 - 8 класс. (Г.И. Саранцев. 1981 год) (1.9 МБ)
2. Элементарная геометрия. Планиметрия. 6 - 8 класс. (Н.А. Глаголев. 1954 год) (5.6 МБ)
3. Геометрия. 6 - 8 класс. (А.Н. Колмогоров. 1979 год) (7 МБ)
4. Геометрия. 6 - 10 класс. (А.В. Погорелов. 1982 год) (5.5 МБ)
5. Геометрия. Пробный учебник. 6 класс. (Л.С. Атанасян, В.Ф. Бутузов. 1987 год) (2.8 МБ)
6. Геометрия. 7 - 11 класс. (А.В. Погорелов. 1993 год) (2.8 МБ)
7. Геометрия. Учебник и сборник задач. 8 - 9 класс. (А.П. Кисилев. 1966 год) (2.3 МБ)
8. Геометрия. Учебное пособие. 8 класс. (А.Н. Колмогоров. 1976 год) (1.2 МБ)
9. Геометрия. 10 - 11 класс. (Л.С. Анастасян. 1992 год) (2.6 МБ)
10. Тригонометрические уравнения и неравенства. Книга для учителя. (И.Т. Бородуля. 1989 год) (2 МБ)
11. Вопросы и задачи по геометрии. Для учителя. (В.А. Жаров. 1965 год) (1.1 МБ)
12. Введение в элементарную геометрию и тригонометрию Лобачевского. (Н.Н. Иовлев. 1930 год) (945.4 КБ)
13. Задача деления круга. Для учителя. (А.Г. Школьник. 1961 год) (2.3 МБ)
Химия
1. Неорганическая химия. 7 - 8 класс (Ю.В. Ходаков. 1986 год) (5.3 МБ)
2. Химия. 1 часть. 7 - 11 класс. (Г.Е. Рудзитис. 1985 год) (5.2 МБ)
3. Химия. 2 часть. 7 - 11 класс. (Г.Е. Рудзитис. 1985 год) (7.2 МБ)
4. Неорганическая химия. 9 класс. (Ю.В. Ходаков. 1976 год) (5.1 МБ)
5. Химия и современность. Пособие для учителя. (Ю.Д. Третьяков. 1985 год) (5.1 МБ)
6. Самостоятельные работы по химии. Пособие для учителя. (Р.Г. Иванова. 1982 год) (3.4 МБ)
Немецкий язык
1. Немецкий язык. 6 класс. ( И.Л. Бим. 1987 год) (3.6 МБ)
История
1. История средних веков. 6 класс. (Е.В. Агибалова. 1981 год) (7.8 МБ)
2. История СССР. Часть 3. 10 класс. (А.М. Пенкратова. 1952 год) - пароль: Русичи Книги
3. История. 3 тома. (1925-1928 г.г.) - пароль: Русичи Книги
4. История средних веков. V - XV века. (В.Е. Степанова. 1969 год) - пароль: Русичи Книги
Литература
1. Энциклопедический словарь юного литературоведа. (В.И. Новиков. 1988 год) - пароль: Русичи Книги
2. Литература. Справочные материалы. (С.В. Тупаев. 1988 год) (9.4 МБ)
3. Литература древней Руси. Пособие для учителя. (О.В. Творогов. 1981 год) (1021.4 КБ)
4. Русская литература. Учебник для средней школы. (А.А. Зерчанинов. 1965 год) - пароль: Русичи Книги
5. Русская древняя литература. XVIII век. (С.М. Флоринский. 1967 год) - пароль: Русичи Книги
Логика
1 . Логика. Учебник для средней школы. (С.Н. Виноградов. 1954 год) (846.4 КБ)
Математика
1. Арифметика. Учебник для первого класса начальной школы. Цветной (А.С. Пчёлко. 1959 год) - пароль: Русичи Книги
2. Маленьким ударникам Урала. Учебник по математике 1-го года обучения (ОГИЗ. 1932 год) (2.4 МБ)
3. Математика. 3 класс. (А.С. Пчёлко. 1990 год) - пароль: Русичи Книги
4. Арифметика. Учебник для 5 и 6 классов восьмилетней школы. (И.Г. Шевченко. 1966 год) (8.2 МБ)
5. Арифметика. 5 - 6 класс. (С.М. Никольский. 1988 год) (7.7 МБ)
6. Математика. 5 класс - учебное пособие. (А.И. Маркушевич. 1971 год) (9.4 МБ)
7. Дидактические материалы по математике для 5 класса средней школы. (А.С. Чесноков. 1990 год) (5.7 МБ)
8. Рабочая книга по математике для пятого года обучения в городской школе. (М.Ф. Берг. 1930 год) (6.2 МБ)
9. Книга для внеклассного чтения по математике в старших классах VIII - X. (А.А. Колосов. 1963 год) (5.7 МБ)
10. Математика колебания. Функции в природе и технике. Книга для внеклассного чтения IX - X классов. (Н.Я Виленкин. 1985 год) (1.7 МБ)
11. Избранные вопросы математики. Факультативный курс. 9 класс. (И.Н. Антипов. 1979 год) (4.1 МБ)
12. Алгебра. Сборник задач по математике для поступающих во ВТУЗы. (М.И. Сканави. 1992 год) (7.3 МБ)
13. Геометрия. Сборник задач по математике для поступающих во ВТУЗы. (М.И. Сканави. 1992 год) (5.2 МБ)
14. Энциклопедический словарь юного математика (А.П. Савин. 1989 год) - пароль: Русичи Книги
Музыка
1. Энциклопедический словарь юного музыканта. (В.В. Медушевский. 1985 год) - пароль: Русичи Книги
2. Практическое руководство по музыкальной грамоте. (Г. Фридкин. 1962 год) (4.1 МБ)
Рисование
1. Энциклопедический словарь юного художника. (Н.И. Платонова. 1985 год) - пароль: Русичи Книги
2. Рисунок. Учебное пособие для ВУЗов (С.В. Тихонов. 1983 год) - пароль: Русичи Книги
Русский язык
1. Русский язык в картинках. Часть I. (И.В. Баранников. 1982 год) - пароль: Русичи Книги
2. Русский язык. Учебник для 1-го класса. (М.Л. Закожурникова. 1965 год) (3.2 МБ)
3. Русский язык. Учебник для первого класса. Цветной. (М.Л. Закожурникова. 1965 год) - пароль: Русичи Книги
4. Русский язык. Учебник для 4 класса средней школы. (Т.А. Ладыженская. 1988 год) - пароль: Русичи Книги
5. Русский язык. Теория. Учебник для 5 - 9 классов общеобразовательных учебных заведений. (В.В. Бабайцева. 1991 год) (2.7 МБ)
6. Русский язык. Учебное пособие для 7 - 8 классов. (С.Г. Бархударов. 1974 год) (3.1 МБ)
7. Русский язык в картинках. Цветной. (И.В. Баранников. 1982 год) (6.6 МБ)
8. Историческая фонетика русского языка. Учебное пособие для ВУЗов. (Высшая школа. 1980 год) (3 МБ)
9. Материалы по занимательной грамматике русского языка. Часть I. (УЧПЕДГИЗ. 1963 год) (4.6 МБ)
Уроки труда
1. Лепка в начальных классах. Книга для учителя. (Я.А. Рожнев. 1985 год) (641.2 КБ)
2. Дидактический материал по трудовому обучению. 2-й класс. (В.И. Романина. 1990 год) - пароль: Русичи Книги
3. Занятия по трудовому обучению. 6 - 7 класс. Пособие для учителя труда. (Г.В. Волошин. 1990 год) (4.2 МБ)
4. Электротехника. Учебное пособие для 9 - 10 классов. (В.А. Поляков. 1982 год) - пароль: Русичи Книги
5. Слесарное дело. Учебное пособие для 9 - 10 классов. (Е.М. Муравьев. 1984 год) (7.8 МБ)
Физкультура
1. Упражнения на бревне для женщин. Характеристика и классификация упражнений (В.Б. Коренберг) - пароль: Русичи Книги

Upd: Здесь, кажется, одной пачкой то же самое: magnet:?xt=urn:btih:33ZRLI5IDNT7MYGKELFUENGROZJODGYE&dn=lit&tr=udp%3a%2f%2ftracker.openbittorrent.com%3a80%2fannounce.

Список здесь: http://sovsklad.balancer.ru/lit_predm.html.
kallypigos: (Hilda)
«Cloud Atlas» и «Атлас описан небом», оказывается, две разные книги двух разных авторов. А еще есть «The Cloud Atlas», не имеющая отношения ни к одной, ни к другой, ни к их авторам.

So it goes.
kallypigos: (hybrid)
1. (Ринпоче) Дзонгсар Кхьенце. Отчего вы не буддист / Dzongsar Jamyang Khyentse. What Makes You Not a Buddhist
2. Dzongsar Jamyang Khyentse (Rinpoche). Not for Happiness: A Guide to the So-Called Preliminary Practices
Этот же автор известен как Кхьенце Норбу; также снимает прикольные фильмы («Кубок», «Маги и странники», «Благо»).
3. Dzogchen Ponlop. Rebel Buddha.

Посерьезнее:
4. (Geshe) Tashi Tsering. Foundation of Buddhist Thought. In 6 volumes.
Геше Таше Церинга из Джамъянского буддистского центра не нужно путать с геше-тезкой из Ченрезигского института, тоже достойным дядькой.
Совершенно недооцененная книжка, специально ориентированная на политехнически подготовленного западного человека. Геше аккуратно отмечает положения, специфичные для махаяны/ваджраяны или для нашей гелугпа.
Тексты всех английских книжек можно найти в Сети, если приложить усилия.

По-русски хороших книжек до огорчения мало.
______

* Махаянская/ваджраянская.

kallypigos: (Pussy Riot)
Лев Усыскин. Основы религиозных культур и светской этики. Первый год обучения. Часть II:


«По своему содержанию – это в чистом виде миссионерская проповедь... содержательное в нем разбросано достаточно аморфно, масса элементарных и важных сведений о вероучении вовсе опущена...

В общем, можно было бы говорить о миссионерском злоупотреблении РПЦ, если б не одно но: учебник дьявольски скучен, как скучна всякая неталантливая проповедь, изложенная суконным языком».




Ну, в общем, в традициях Закона Божьего, как мы недавно выяснили.

Вдогонку к тому же обсуждению: было такое «злоупотребление», против которого ни инославные/иноверные, ни агностики с атеистами особо не возражали: Александр Мень. История религии (в 2-х томах). Учеб. пособие. — М.: Издательская группа «ФОРУМ-ИНФРА-М», 1997. — 216+224 с.: ил.

Это адаптация известного многотомника («В поисках Пути, Истины и Жизни»+«Сын Человеческий»+недописанная «Апостолы»), написанного в градуалистско-откровенном ключе, дополненная главками про ислам. Адаптация для школьников, но для средне- и страшеклассников, конечно, а не для начальных классов. Хотя у нас вполне идет внарезку по модулям ОПК и ОМР.

Возможно, потому и не возражали, что не скучна.

kallypigos: (Hilda)
Сегодня с утра вспомнила, словечки из какой книги несколько раз приходили мне на ум, когда читала «Дом...» Петросян. Провела небольшое сетевое и полевое исследование, выяснила, что книгу читали все от моего возраста и старше и не читал никто от моего возраста и младше.

ccrawfordЭто Чарльз П. Кроуфорд «Бег на трех ногах» / Charles P. Crawford “Three-Legged Race” (За найденный оригинал спасибо Гаер).
Автор, судя по всему, гораздо более известен в б. СССР, чем в Америке. Вотздесьнекоторые детали биографии. Судя по этой страничке, он же известен как Cardy Crawford. А здесь он читает не свою (и совсем не детскую) книжку.
Известен у нас он, к сожалению, в не слишком хорошем переводе. Автором перевода названа Марина Литвинова, и если это та самая Марина Литвинова, то перевод все же не такой трешевый, как «ГП», ну или редакторы в издательствах в 1980 г. еще не были изведены как класс. Впрочем, возможно, что это другая Марина Литвинова.
Оригинал я по возможности прочту.
kallypigos: (Pussy Riot)
1. Свящ. Александр Мень. В поисках Пути, Истины и Жизни. Тт. 1, 2, 3, 4, 5, 6, 7.
2. Гилберт Кит Честертон. Вечный человек. Ортодоксия. Св. Франциск Ассизский. Святой Фома Аквинский. (Честертона имеет смысл читать как раз по-русски, поскольку Трауберг и Сумм сделали чудо, превратив фонтаны косноязычия этого автора в пристойный текст, вроде бы, ничего и не поменяв).
3. Клайв Стейплз Льюис. Просто христианство (Mere Christianity). Боль (The Problem of Pain). Чудо (Miracles: A Preliminary). (Переводы хорошие).

Вообще, если тянет в церковь, имеет смысл почитать. Три хороших автора из трех различных конфессий. Не читайте Нилуса и Кураева, попадете вместо церкви в прачечную. Хотя взрослому человеку место все же в сангхе.
kallypigos: (Hilda)
Поскольку карточка с книжками не выдержала перелета, каникулярные читальные планы пришлось поменять, о чем не жалею.


☑  Noah Gift, Jeremy Jones. Python for Unix and Linux System Administration. O'Reilly, 2008 (ISBN 0596515820).
Книжка странная. С одной стороны, есть административные задачи, которые удобно решать на питоне. С другой стороны, их там меньшинство. Получается похоже на стиль "пиши все на перле". В общем, книга весьма добросовестная, но вряд ли я из нее вынесу что-то для себя полезное, кроме, быть может, полудюжины неожиданных примеров.

Mark Lutz. Programming Python, 4th Edition.
Нырнула в книжку, вынырнула и поняла, что нужно вернуться к недопройденной Learning Python. В принципе, наверное, можно бы читать вторую книгу, возвращаясь лишь там, где непонятно. Но у Лутца есть план, и я предпочитаю планомерно восхищаться его дидактическим мастерством.

Stephen Batchelor. Confession of a Buddhist Atheist. Random House, 2010 (ISBN 0-385-52706-3).
Добралась пропущенной книжки (просто ее у меня не было). При всей бесспорности заслуг Бэчелора в деле перевода и комментирования и при всех симпатиях к его авантюризму, книжка оставила неоднозначное впечатление. Все тот же коренной позитивизм, прорастающий сквозь собственную духовную биографию, и все та же грань безвкусицы в исторических реконструкциях (нечто среднее между Д. Штраусом и М.Булгаковым вышло). Местами просто Ньянгавира Т'эра в облегченной версии (кстати, и Т'эру, и даже Эволу он весьма сочувственно цитирует). Будь преп. Ньянгавира постарше или Бэчелор помладше, наверняка кое-кто из моих знакомых похихикал бы насчет перерождений.
При всем при этом, у меня осталось чувство, что книга написана совершенно искренне и без рисовки. Слог хороший, свободный, чувство юмора имеет место. Зарисовки из ранней жизни тибетской общины в изгнании просто великолепны.
Вот здесь неплохая заметка: A Difficult Pill: The Problem with Stephen Batchelor and Buddhism’s New Rationalists by Dennis Hunter. И очень поучительное обсуждение в комментариях. В жизни бы не подумала, что буду с интересом читать материал с этого сайта. Спасибо Бэчелору, чего уж там.

Иван Бунин. [Разнообразные произведения].
Завершая спор полугодичной давности... Я была неправа, Бунин совершенно не входит в первый ряд прозаического канона I половины XX в. После чеховского постреализма это просто шаг назад, к Тургеневу с Гончаровым.
Вообще, бессмысленно говорить о XIX в. или XX в., нужно делить литпроцесс в прозе на до и после Чехова. Но стихи поразительны. Особенно хорошо, когда читаешь стихотворения разных лет подряд. Он работал над собой постоянно, и с каждым годом дух дистиллировался.
kallypigos: (fox_high)
1) Море на месте.Слухи о боящихся смуты отдыхающих сильно преувеличены. В общем, полно европейцев в Шармале. Наш почти пустой корпус и скидочная цена не из-за революции, а из-за только что прошедшего ремонта.

2) Практически пустой отель 5* очень близок к моему обывательскому представлению о счастье. Подружилась с двумя скандинавками и египетской девушкой-сотрудницей. Собственно Новые Года (Годы?) от норвежского до московского встречали в бассейне втроем-вчетвером.

3) "Приехала на пляж, а там станки". Протянула по своему этажу забытую строителями слаботочку, обжала и частично даже скоммутировала :) (Самое смешное, что я три года назад даже была там со своей обжимкой, просто забыла из рюкзака вынуть). В общем, женщина-техник или инженер никого там не шокирует, на самом деле. Строители такие же халтурщики, как наши.

4) Первый раз привязались арабские погранцы-таможня: собачке понравились безобидные индийские таблетки. Лист назначений все равно прочитать никто не смог (до сих пор была уверена, что добрейшая Лидия Яковлевна как раз вязью там что-то вроде сур и пишет). Смешно, что конская доза кодеина и шприцы (из-за которых лист назначений и возится с собой) никого при этом не насторожили.
Tags:
kallypigos: (hybrid)

План уроков
для VIII класса
(с открытым посещением
для учеников IX—XI классов)

Обратите внимание на изменение часов занятий с января и на другие изменения (ниже)!

Ноябрь—декабрь 2012

0. Общее понятие о программировании. Планирование человеческой деятельности. Программирование технических устройств. Программирование специализированных и универсальных устройств.

1. Ввод-вывод. Терминал. Запуск интерпретатора питона. Питон как калькулятор.
2. Ход исполненияпрограммы. Последовательное исполнение.Численные типы данных.
3. Условное и циклическое исполнение.

4. Строки и работа с ними.
5. Словари и работа с ними.
6. Словари и работа с ними (продолжение).
Списки и работа с ними.
7. Списки и работа с ними (продолжение).

Январь-февраль 2013

8. Общее представление об объектах.

9. Объектное и объектно-ориентированное программирование.
10. Библиотеки объектов. Стандартные и собственные библиотеки.
11. Общее представление о функциональном программировании.
12. Эквивалентность императивных и функциональных конструкций.
13-14. Лямбда-функция иинтроспекция программ.

Administrivia

0) Эти занятия не заменяют, но дополняют основной курс "Информатика и ВТ". Но результатами тестирования (если они окажутся выше) можно будет заменить результаты тестирования по основному курсу. Ярекомендую этот курс не только отличникам, но и тем, кто не вполне уверенно чувствует себя в основном курсе. Поскольку он изначально ориентирован на восьмиклассников, вы повторите все общие темы. Приходите.

1) Занятия будут проходить пятыми-шестыми уроками по средам и пятницам (4 часа в неделю) начиная с
16 января. Это лекции + практические занятия, веду я.
4) Еще одна факультативная пара с практическими занятиями и индивидуальными консультациями будет проводиться по субботам пятым-шестым уроком. Ведут Виктор Маклушев (11 "а") и Лиля Смирнова (10 "а"),
Наталья Букова (11 "а"), Сергей Маклушев (10 “б”).
5) Лиля готова заниматься с отстающими из любых классов и по темам, не связанным
с питоном.

P.S. Я удовлетворена успеваемостью учеников. Отставание от изначального расписания целиком моя
вина.

kallypigos: (Hilda)

Сама по себе мысль о том, что у дома (или у бытовой стороны действительности как таковой) есть «изнанка» — топос детской литературы (и литературы для детей, и литературы про детей). И не только литературы: у каждого дома, где спят и растут дети, она есть.
В самом «Доме...» упоминается Кэррол, но можно вспомнить сразу Барри, Трэверс и даже попсового Льюиса. Но если мы вспомним, что у Изнанки есть свой король (Слепой), что он брошен в детстве, что он ее определенным образом консолидирует (умеет видеть чужие сны, отыскивает беспамятных Прыгунов), что он выступает проводником туда-обратно, что Изнанка аллохронна по отношению к Лицевой Стороне, ближайшим фабульным прототипом оказывается именно «Питер Пэн». Прочитывается рядовым читателем это плохо, поскольку Питер Пэн (в отличие от Алисы, Бэнксов и героев «Нарнии») по-настоящему не претерпел рецепции русской культурой, отчасти из-за (относительной) неудачи великой Демуровой, отчасти, возможно, из-за чуждости базовой идеи «жестокости» детства.
Однако «Дом...» не является «ремиксом» «Питера Пэна». Существенно изменена фактура, существенно изменен антураж и, главное, сдвинута и перестроена сама фабула. В «ПП» есть остающиеся на Изнанке (Потерянные Мальчики) и возвращающиеся на Лицевую Сторону, но по большому счету эта категоризация предзадана. Нет взаправдашней ситуации выбора (фабульно, сюжетно же ожидания читателя могут быть разными, в зависимости от читательской компетентности), обратный путь изначально вписан в структуру смены поколений, которые будут уходить в Нигделандию и возвращаться, а останутся только те, кто потерян.
В «Доме...» же главный герой герой, как ни крути, Сфинкс (если придерживаться понимания самого Сфинкса, и не считать больше таковым сам Дом), и кульминацией его линии является именно выбор, который озвучивает для него Слепой. Сфинксу, кстати, идти в Наружности особо некуда, и даже в университет ему приходится готовиться дополнительный год (а, допустим, у Крысы родительский дом как бы и есть, но она уходит на Изнанку).
Далее, Нигделандия в «ПП» это, в общем-то, место, с прописанной не только онтологией, но и топографией. Если это и мир со своими законами, то он замкнутый, а сами законы счетны. В «Доме...» Изнанка — тайна, это целый мир, где обозначены места, у мест — свои законы, но известно все это фрагментарно, причем не только читателю, но и героям (а наверное, что-то неизвестно и автору). Даже Слепому придется «долго искать» тех, кто ушел лишь наполовину, и Спящие будут исчезать весьма постепенно.
Радикально питерпаническая интерпретация возможна, если мы сочтем, что до поколения Слепого—Сфинкса изнанка существует лишь фрагментарно, в домовом фольклоре про Прыгунов и Ходоков, в традиции Ночей, Когда Можно Говорить, в нетрезвых песнях, проговорках местных поэтах и настенных надписях, а объединить все это и реализовать удается только Слепому с подаренной ему тыквой-горлянкой. Умеренно питерпаническая — если мы сочтем, что в каждом поколении (или в некоторых из них) клочковатая Изнанка собирается заново. Непитерпаническая — если мы сочтем мир Изнанки изначально существующим и предзаданным, в частности, предзаданным социопсихически, если мы сведем его к серии трипов в общей обстановке (setting) со сходными установками (sets).
Опоры в тексте для того, чтобы дать уверенный ответ, выбрать какую-либо из интерпретаций, не находится, сюжетное построение старательно укрывает, в частности, именно эти детали фабулы. Привлечение данного фабульного сопоставления ценно тем, что позволяет этот вопрос поставить.
kallypigos: (hybrid)
Дурацкий (если взять во всей полноте) текст на дурацкую тему, но...
...Дмитрий Львович [Быков] ... как дама приятная во всех отношениях, только не дама.
Умеет старик Лимоныч припечатать.
Nov. 16th, 2012 09:55 pm

sh всё

kallypigos: (Chinese)
Систематического курса элементов программирования на языке стандартной оболочки ОС в этом академическом году у нас не будет :( Извините.
kallypigos: (Pussy Riot)


1) Любить Христа никак не помешает. Более того, могут стать очевидными дополнительные к тому причины — если вам для этого нужны причины.

2) Следовать заповедям (в любом объеме, предполагаемом известными мне христианскими деноминациями) не помешает. Наименее проблемная триада макаризмов получит дополнительные основания — опять-таки, если вам таковые нужны.

3) Сложный момент: Исповедовать Символ Веры вы сможете, начиная с определенного уровня, не безоговорочно.

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

Пояснить это проще на «нерелигиозном» примере.

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

В то же время, вы будете знать, что при разработке более сложной, электронной схемы вам потребуется совсем другая система представлений: о том, что не ток движется от плюса к минусу, а электроны от минуса к плюсу, что кроме того существует дырочная проводимость, и что переходы между зонами электронной и дырочной проводимостью подчиняются особым законам. Подчеркну, что все это также может иметь не лишь техническое, а и практическое значение. В других случаях для моделирования электрических явлений нужно прибегать к уравнениям Максвелла etc. ad infinitum.

То есть, пока вера имеется в виду связанной с практикой, ей ничто не помешает (а может, и поможет). Если веру оторвать от дел, ее предметы онтологизируются и практика пойдет наперекосяк.

4) Собственно частной исповеди и причастию не помешает, если вы не считаете какие-либо аспекты практики греховными. Но если считаете, зачем вам практиковать?

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

Две оговорки: а) я могу говорить лишь за северные традиции; б) дзен практикуют и знакомые мне православные, но в дзен практики довольно карманные.



kallypigos: (Default)
За каникулы я обязана:
  1. Расписать поурочно планы всех актуально читаемых в этом году курсы по предмету.
  2. Подготовить тезисы выступлений на двух литературных семинарах.
  3. Сделать прикидку того, что и кем будет читаться и вестись по предмету в 2013/14 уч. г.
kallypigos: (Chinese)

План уроков для VIII класса
(с открытым посещением для учеников IX—XI классов)


План )

Administrivia

См. http://kallypigos.livejournal.com/13265.html

kallypigos: (Pussy Riot)
Я отбываю до среды, 31 октября. Приду к 3 уроку. Adieu.
Tags:
kallypigos: (Hilda)
В понедельник, 11 12 ноября, восьмым уроком в актовом зале пройдет лит. семинар "Детская литература для взрослых".
Записались:
Нинель Леонидовна. «Онтология времени в романе „Дом в котором...“ Петросян».
Я. «„Питер Пен“ Барри и „Дом в котором...“ Петросян: ремикс или римейк?».



19 ноября
Нинель Леонидовна. «Образ подростка в „Выморочной должности“ Роулинг».
Я. «Что теряет читатель при профессионализации автора (на примере двух последних книг Дж. Роулинг)»

26 ноября
А. Сашкина (10 "а"). «Как я провела лето со стихами Бориса Херсонского»
Нинель Леонидовна. «Северная дикция в южной столице: Борис Херсонский»

Декабрь
Русская литература 2012 г.
Е. Соловьева (10 "а") Испанская литература 2012 г.
Д. Рут-Смирнова (11 "а")  Английская литература 2012 г.

Список открыт, но я бы попросила читавших Петросян и свежий роман Роулинг (есть еще кроме нас такие?), стихи  Бориса Херсонского подготовить по крайней мере развернутые реплики.

Также Н. Л. просит идей насчет семинаров этом академическом году.

kallypigos: (Chinese)
Обработка графики. Есть мысль (пока не решение) убрать эти темы из основного курса в отдельных классах и заменить их поточными занятиями для всех с примерами на паскале и питоне в конце года (часов на 6 или 8).
Пострадают при этом XI параллель, поскольку им будет не для этого, с другой стороны, в прошлом году у них было четыре урока по данной теме на паскале.
У кого есть мысли по этому поводу, пожалуйста, напишите записку почтой или передайте в кабинет. При необходимости соберемся и поговорим.
kallypigos: (Chinese)
"Элементов программирования на си" в этом году не будет.
Некому и некогда читать этот курс, извините. Впрочем, если кто-то из ланкастер-матеров передумает, буду только рада.
P.S. Десяти- или одиннадцатиклассник нашей школы, имеющий твердую четверку или выше, может самостоятельно выучить си по Кернигану—Ритчи за пару месяцев неспешной работы, проверено.
kallypigos: (Chinese)
Сергей Марков хотел бы в этом году провести факультативный курс "Элементы программирования на языке стандартной оболочки ОС" (с января или даже с декабря и до забора исчерпания материала).


Поскольку замысел у него пока лишь самый общий, он приглашает заинтересованных учеников собраться послезавтра, 31 октября, на седьмом уроке в актовом зале и обсудить.
С большой вероятностью Сергей займет с января должность преподавателя. Тем не менее, курс факультативный, а не элективный, и результаты тестирования (если Сергей вообще будет его проводить) не будут учитываться при выставлении оценок по моему предмету.
XI класс помнит, что два года назад мы с ними пытались углубленно изучать оболочку, и вышло это у нас не слишком хорошо. Но этим летом Сергей ознакомился с большим количеством методических разработок, и идеи о содержания курса у него есть. Мы разговаривали два раза на эту тему, и меня они впечатлили. Так что приходите, поговорим (я буду стараться освободиться и тоже подойти).

kallypigos: (Chinese)
Желающим пройти в I полугодии курс "Введение в императивное программирование на питоне" с VIII параллелью иметь в виду следующее:
0) Эти занятия не заменяют, но дополняют основной курс "Информатика и ВТ". Но результатами тестирования (если они окажутся выше) можно будет заменить результаты тестирования по основному курсу. Я рекомендую этот курс не только отличникам, но и тем, кто не вполне уверенно чувствует себя в основном курсе. Поскольку он изначально ориентирован на восьмиклассников, вы повторите все общие темы. Приходите.


1) Занятия будут проходить седьмыми—восьмыми уроками по средам и пятницам (4 часа в неделю) начиная со 2 ноября. Это лекции + практические занятия, веду я.
2) X "б" и XI "а" классам: конфликт с физкультурой решается следующим образом: у кого в этом году только хорошие оценки и освобожденные просто отмечаются у старосты, троечники—двоечники должны решить вопрос в индивидуальном порядке со мной (и нужны веские причины и готовность пересдавать физкультуру, чтобы я просила за вас учителя).
3) Автобуса через речку в пятницу после занятий не будет. Ищите общественный транспорт, а кого забирают на легковушках, делитесь местами с товарищами, пожалуйста.
4) Еще одна факультативная пара с практическими занятиями и индивидуальными консультациями будет проводиться по субботам, видимо, со следующей недели. Ведут Виктор Маклушев (11 "а") и Лиля Смирнова (10 "а"); позднее к ним должна присоединиться Наталья Букова (11 "а"). Время будет определено дополнительно после того, как утрясутся часы репетиций хора. Транспорта через речку не будет, видимо.
5) Лиля любезно готова заниматься с отстающими из любых классов и по темам, не связанным с питонам, и у кого есть нерешенные проблемы, я советую с ней поговорить, поскольку, если бы мне нужна была помощь, я бы пошла именно к ней, а не к себе :) Что касается питона, то и Лиля, и Виктор, и Наталья знают его лучше меня.

P.S. Я благодарю учеников IX параллели, восполнивших свое отставание, их классных руководителей, старост и всех, кто помогал одноклассникам, а также опять-таки Лилю Смирнову. Без улучшения результатов параллели мы вряд ли смогли бы подготовить чтение этого курса широким потоком.

kallypigos: (Hilda)
За выходные дочитала волшебные Третью часть и Эпилог, перечитала непонятные места. Ознакомилась с рецензиями и сообществами.
Состояние критики литературной удручает, конечно. В очень толстых журналах публикуются статьи, авторы которых просто не удосужились освоить "матчасть": внимательно прочитать рецензируемый текст. Сообщества, напротив, обрадовали преобладающим ровным и трезвым тоном и обилием прекрасного фанарта.
Хочется взять паузу и подумать. Очень хочется найти время и перечитать или переслушать...

Ресурсы:
kallypigos: (hybrid)
"Добила" за выходные II книгу. Волшебно совершенно! Жалко, что это не досталось мне летом...

Ресурсы:
kallypigos: (Hilda)
По рекомендации, от которой невозможно отказаться которой невозможно не последовать, прочла за как нельзя кстати растянувшиеся выходные I часть "Дома, в котором..." М. Петросян. Очень жаль, что рекомендация не последовала летом; книга хочет "полного погружения", невозможного для меня сейчас. Само это ощущение почти забыто: прошлый раз я так читала, наверное, Музиля, до которого руки дошли вообще с огромной задержкой (где-то в самом начале десятилетия это было).
Впечатления пока очень сильные. Я прочла (вернее, прослушала) сначала первую главу ("Курильщик: Некоторые преимущества..."), она понравилась языком, но неколько страшновато было предвидеть тысячу страниц в духе Райт-Ковалевой. Но, как потом оказалось, стиль главы не исчерпывает разнообразия текста. В общем, о языке I книги можно более или менее судить по первой главе плюс первой Интермедии.
Рекомендовать, наверное, бессмысленно: во-первых, все, кому нужно, уже прочитали, во-вторых... Достаточно и во-первых. Совсем не удивительно, что книгу обошли все основные премии: она совершенно поперек всего литературного процесса последних десятилетий, и это само по себе отдельная рекомендация.
А вот со школьниками о книге я обязательно поговорю, когда сама дочитаю.
kallypigos: (Default)
Закончился первый в жизни отпуск, когда удалось сделать все запланированное.

Хотя не все, что хотелось.
Aug. 20th, 2012 05:15 pm

RIP Т.В.

kallypigos: (Default)
Т.В. умерла двадцать минут назад. Спокойно, во сне, с улыбкой.

Read more... )

Profile

kallypigos: (Default)
kallypigos

May 2017

S M T W T F S
 123456
78910111213
14151617181920
21222324 2526 27
28293031   

Syndicate

RSS Atom

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 7th, 2025 02:12 pm
Powered by Dreamwidth Studios