20 f) Turn billing off
21 r) Report ststistics
23 enter response (s,c,l,v,n,f,r,): \c"
25 read RSP
27 case $RSP in
28 "") break;;
29 s) echo "\Enter project name ( for exit): \c"
30 read PROJ2
31 if [ "$PROJ2" = "" ]
32 then continue
33 fi
34 if [ ! -s $PROJ2.time ]
35 then echo "you must specify a valid project
file"
36 continue
37 fi
38 PROJ="$PROJ2";;
39 c) echo "\nEnter the new project name ( to
exit): \c"
40 read PROJ2
41 if [ "PROJ2" = "" ]
42 then continue
43 fi
44 if [ -f "$PROJ2.time" ]
45 then echo "\n ** $PROJ2 already exists **"
46 continue
47 fi
48 PROJ="$PROJ2"
49 echo "\nProject file created: $PROJ"
50 echo "Project file created: `date`\nOFF: begin"
> $PROJ.time;;
51 l) echo "\nCurrent project files:\n"
52 ls -l *.time 2>/dev/null || echo "no project
files" |
53 sed "s/\.time//";;
54 v) if [ "$PROJ" = "" ]
55 then echo "you must select a project file
first"
56 continue
57 fi
58 echo "\n:----------------------------"
59 more $PROJ.time
60 echo ":---------------------------";;
61 n) if [ "$PROJ" = "" ]
62 then echo "you must select a project file
first"
63 continue
64 fi
65 if [ "`tail -1 $PROJ.time|cut -d: -f1`" !=
"OFF" ]
66 then echo "logging was not turned off"
67 continue
68 fi
69 echo "\nBilling turned on for project file:
$PROJ"
70 echo "ON: `date`" >> $PROJ.time;;
71 f) if [ "$PROJ" = "" ]
72 then echo "you must select a project file
first"
73 continue
74 fi
75 if [ "`tail -1 $PROJ.time|cut -d: -f1`" !=
"ON" ]
76 then echo "logging was not turned on"
77 continue
78 fi
79 echo "\nBilling turned off for project file:
$PROJ"
80 echo "OFF: `date`" >> $PROJ.time;;
81 r) while :
82 do
83 echo "
84 Statistics
85 ---------- Project: $PROJ
86 a) Accumulative time totals
87 n) All times on
88 f) All times off
90 enter response (a,n,f,): \c"
92 read RSP
94 case $RSP in
95 "") break;;
96 a) awk '/Total:/ { PRINT $0 }'
$PROJ.TIME;;
97 n) awk '/ON/ { print $0 }'
$PROJ.time;;
98 f) awk '/OFF/ { print $0 }'
$PROJ.time;;
99 *) echo "\n ** Wrong command,
try again **";;
100 esac
101 done;;
102 *) echo "\n ** Wrong command, try again **";;
103 esac
104 done
ПРЕМЕННЫЕ СРЕДЫ ВЫПОЛНЕНИЯ
PROJ Содержит текущее имя проекта
PROJ2 Содержит временное имя проекта, введенное пользователем
RSP Содержит команду выбора из меню
ОПИСАНИЕ
ЗАЧЕМ НАМ НУЖЕН timelog?
Время - драгоценный товар. Его всегда не хватает, и если уж оно
использовано, то его никогда больше нельзя вернуть. Мы хотим быть уве-
рены, что наше время используется плодотворно. Мы можем и должны соз-
дать инструментальные средства, которые помогут нам управлять нашим
временем и фиксировать его.
Мы должны рассмотреть следующие вопросы: над какими проектами мы
работаем, в течение какого времени мы над ними работаем (т.е. начало и
окончание), и какую еще информацию нам нужно хранить.
Как раз почти все эти функции поддерживаются программой timelog.
Мы написали довольно длинную программу, но заметим, что на самом деле
работа над этим средством не окончена. Предлагаемый командный файл
timelog подготавливает вас к работе с системой управления временем.
Вам нужно вставить ваш собственный текст для выдачи отчетов, основан-
ных на статистике времени.
ЧТО ДЕЛАЕТ timelog?
Timelog относится к весьма важной области, связанной с фиксацией
времени и управлением временем. Отметим, что количество учетных сведе-
ний, которые можно создать, просмотреть и обработать, ограничено толь-
ко доступным пространством файловой памяти.
Timelog - это полностью управляемый с помощью меню интерфейс.
Системы с меню в UNIX - это нечто новое, они имеют свои преимущества и
недостатки. Одним из преимуществ является то, что вся работа над дан-
ными выполняется программно, а не вручную. Кроме того, каждую функцию
наглядно видно и легко выбрать. Вам нет необходимости запоминать опции
и имена файлов, достаточно просто нажать одну клавишу для выполнения
действия.
Недостатком является то, что меню работают медленнее, чем ручной
интерфейс (т.е. просто набор и непосредственное выполнение команд).
Это очень важное замечание, но мы должны также помнить, что программы
должны быть простыми в использовании, простыми для модификации и вы-
полнять множество мелочей, связанных с какой-либо идеей или областью
назначения. Потеря машинного времени чаще всего лучше, чем потеря вре-
мени человека! Другой недостаток - для того чтобы добраться до опреде-
ленной функции, вы должны пройти через несколько уровней меню.
Например, чтобы напечатать отчет, вы должны вызвать timelog, выб-
рать меню статистики, затем выбрать нужный вам отчет. Здесь три уров-
ня, а при наличии утилиты вы могли бы всего одной командой сказать
"report report_file".
Для утилит, выполняющих одну функцию, наличие одной команды с
несколькими опциями довольно эффективно. Такой подход применяется в
большинстве командных файлов интерпретатора shell. Но когда у вас есть
множуство небольших задач, выполняемых над группой объектов, меню бо-
лее удобны.
Некоторые системы предоставляют интерфейс, управляемый как меню,
так и командами. Это устраивает больший круг пользователей и позволяет
избежать большинства недостатков, упомянутых выше. Конечно, при таком
подходе неминуемы некоторые издержки и программа становится более
длинной.
При вызове timelog на экран выводится начальное меню, как показа-
но ниже.
---------------------------------------------------------------------------
|
| Thu, Jun 19 21:32:12
|
| Time Logger
| ----------- Project:
| s) Select a project file
| c) Create a new project file
| l) List current project files
| v) View the project file
| n) Turn billing on
| f) Turn billing off
| r) Report statistics
|
| enter response (s,c,l,v,n,f,r,):
В левом верхнем углу показан день недели и дата. В правом верхнем
углу показано время. Это реальное время, и оно обновляется при каждом
вызове меню. Имя меню "Time Logger" (регистратор времени). "Report
statistics" (сообщить статистику) вызывает появление подчиненного ме-
ню.
Строка, в которой написано "Project:" (проект), показывает, что
текущее имя проекта нулевое. Для того чтобы работать над проектом, вы
сперва должны создать файл проекта или выбрать его, если он уже су-
ществует. Все действия, выполняемые после этого, относятся к текущему
файлу проекта.
Первый пункт меню s предназначен для выбора файла проекта. После
выбора этого пункта выводится сообщение:
---------------------------------------------------------------------------
|
| Enter project name ( for exit):
| Введите имя проекта ( для выхода):
Вы можете ввести любую текстовую строку в качестве имени проекта
или, если вам не нужна эта опция, нажать клавишу возврата каретки для
благополучного выхода. Если вы не помните имена проектов, вы можете
использовать опцию l, поясняемую ниже. После ввода имени существующего
проекта, текущему имени проекта (которое печатается справа вверху в
каждом меню) присваивается имя этого файла.
Следующей является опция c для создания файла проекта. Как уже
отмечалось, это должно быть первым, что вы делаете, начиная работать с
утилитой timelog, но после этого вы обычно выбираете существующие фай-
лы. Когда вы выбрали опцию c, печатается следующее приглашение:
---------------------------------------------------------------------------
|
| Enter the new project name ( to exit):
| Введите имя нового проекта ( для выхода):
Здесь нужно вводить то же самое, что и при выборе проекта. Для
выхода нажмите возврат каретки. После ввода имени текущее имя проекта
изменяется, создается файл проекта, запоминается время, и файл загру-
жается исходной информацией.
Следующая опция l предназначена для выдачи списка имен файлов
проектов. Поскольку каждый проект является файлом, отображается список
в виде, обычном для команды ls. Тем не менее, будьте внимательны.
Список нельзя получить прямо командой ls. Имена изменены для защиты от
наивных.
Каждый файл проекта хранится на диске в формате "project. time".
Часть project в каждом файле отличается и представляет собой имя, вве-
денное в опции создания. Все файлы имеют суффикс .time. Когда выво-
дится список, префикс .time отбрасывается, так что имена файлов явля-
ются просто проектами, которые вы ввели в опции выбора проекта. Здесь
все работает, но вы должны помнить, что если вы захотите просмотреть
файлы времен вручную, то имена не будут теми же самыми. Если нет ника-
ких файлов проектов, то об этом выводится сообщение.
Следующей опцией является v для просмотра файла проекта. Файлом,
который вы собираетесь просмотреть, является текущий файл проекта. Его
имя выводится в меню справа от слова "Project:". Если не появилось ни-
какого имени, вы должны сперва создать новый проект или выбрать су-
ществующий. Файл проекта выводится на экран командой UNIX more.
Следующей опцией является опция n для включения подсчета времени.
Это означает начало записи нового сеанса работы над проектом. Проверя-
ется имя проекта, чтобы выяснить, был ли выбран файл проекта. Если
нет, выводится сообщение о том, что нужно это сделать. Затем проверя-
ется, был ли файл проекта отключен предыдущей операцией. Если да, то
регистратор времени может быть включен. Вы не можете включить его
дважды. Вы должны отключить его, затем включить и т.д.
Следующая опция f отключает подсчет времени для файла проекта.
Текущее имя проекта сравнивается с нулевым, и если это так, то выво-
дится соответствующее сообщение. Затем проверяется, был ли предвари-
тельно включен подсчет времени для этого файла. Если был, то в файл
проекта добавляется запись о выключении подсчета.
Последней опцией является r для отчета и статистики. После ее вы-
бора на экран выводится подчиненное меню:
---------------------------------------------------------------------------
|
| Statistics
| ---------- Project:
| a) Accumulative time totals
| n) All times on
| f) All times off
|
| enter response (a,n,f,):
Как упоминалось ранее, это меню на самом деле не реализовано.
Несколько команд-заглушек позволяют этому меню функционировать, но в
этом месте вы можете настроить отчеты по вашим требованиям. Обратите
внимание, что имя проекта также выводится в этом меню. Это имя затем
доступно для любых функций, помещенных в данное меню.
ПРИМЕРЫ
1. c,l,v
Это первый набор команд при первоначальном запуске. Опция c -