Annotation of processmail/process.tex, revision 3.0
3.0 ! boris 1: %$Id: process.tex,v 2.7 2005/02/20 03:24:43 boris Exp $
1.1 boris 2: %$Log: process.tex,v $
3.0 ! boris 3: %Revision 2.7 2005/02/20 03:24:43 boris
! 4: %Wrote readme
! 5: %
2.7 boris 6: %Revision 2.6 2005/01/24 03:28:53 boris
7: %Re-added
8: %
2.5 boris 9: %Revision 2.4 2002/02/04 16:53:15 boris
10: %Added numletters
11: %
2.4 boris 12: %Revision 2.3 2002/02/04 16:52:37 boris
13: %Added num
14: %
2.3 boris 15: %Revision 2.2 2002/02/04 15:43:34 boris
16: %Added new features
17: %
2.2 boris 18: %Revision 2.1 2002/02/04 15:04:53 boris
19: %Started anew
20: %
2.1 boris 21: %
1.1 boris 22: %Revision 1.9 1998/11/29 21:56:12 boris
23: %Добавил благодарности
24: %
25: %Revision 1.8 1998/11/29 21:50:48 boris
26: %Добавил изменения в формате.
27: %
28: %Revision 1.7 1998/11/17 22:48:33 boris
29: %Отказался от попытки включить программу в файл -- не совместимы с кои-8
30: %:(
31: %
32: % Revision 1.6 1998/11/17 17:02:51 boris
33: % Добавил регистрационные номера в формат.
34: %
35: % Revision 1.5 1998/11/15 04:52:25 boris
36: % Написал интерфейс.
37: %
38: %Revision 1.4 1998/11/15 03:38:25 boris
39: %Написал раздел "Форматы"
40: %
41: %Revision 1.3 1998/11/15 02:35:43 boris
42: %Исправил заголовки
43: %
44: \documentclass{article}
45: %
46: % Руссификация. Бывает и новее...
47: %
2.2 boris 48: \usepackage[koi8-r]{inputenc}
49: \usepackage[russian]{babel}
2.7 boris 50: \usepackage{t1enc}
1.1 boris 51: \usepackage{amsmath}
52: \newcommand{\prog}[1]{\ensuremath{\text{{\textsl{#1}}}}}
53:
54:
55:
56: \begin{document}
57:
2.7 boris 58: \title{Программа для обработки писем в ИГП и ИЧБ}
2.2 boris 59: \author{Boris Veytsman, \texttt{borisv@lk.net}}
2.7 boris 60: \date{Февраль 2005}
1.1 boris 61: \maketitle
62: \thispagestyle{empty}
63: \tableofcontents
64:
65: \section{Введение}
66:
67: С тех пор, как количество команд в IGP превысило первый десяток,
68: подведение итогов тура стало тяжким бременем для дежурной
69: команды. Прочесть невероятное количество писем, извлечь ответы,
70: составить таблицу, да еще Собрание Сочинений\dots{} На это вполне может
71: уйти целиком рабочий день. Именно с этой целью по предложению Якова
2.7 boris 72: Зайдельмана написана эта программа. Позднее эта программа
73: переписывалась при изменении регламента соревнований, добавлении ИЧБ и
74: т.д.
1.1 boris 75:
76: Идея состоит в следующем. Самый важный этап в деятельности дежурной
77: команды---решить, заслуживает ли данный ответ плюса или минуса. Это мы
78: автоматизировать не можем. Но это автоматизировать и не надо. А вот
79: все остальное автоматизировать можно и нужно. Значит, программа должна
80: делать следующее:
81: \begin{enumerate}
82: \item Извлекать ответы из файла с письмами команд
83: \item Записывать их в файл, где все ответы были бы рядом, и было бы
84: оставлено место для оценки
85: \item Читать этот файл \emph{после} того, как дежурная команда
86: проставит оценки и составлять таблицу и собрание сочинений.
87: \item Время от времени создавать список команд, чьи ответы уже
88: получены, и слать на информационный лист.
89: \end{enumerate}
2.7 boris 90: Необходимо учесть еще несколько важных обстоятельств:
1.1 boris 91: \begin{enumerate}
92: \item Команда может прислать несколько писем. В этом случае более
93: позднее письмо считается более авторитетным, чем более раннее. Мы
94: будем предполагать для простоты, что более поздние письма находятся
95: в файле с письмами позже более ранних. Дело дежурной
96: команды---обеспечить такой порядок писем (может быть, вручную
97: корректируя взбрыки e-mailа).
98: \item Дежурная команда может оценивать ответы параллельно их
99: получению. Поэтому нельзя ``забывать'' старые оценки, читая новые.
2.7 boris 100: \item В последнее время в ИГП и ИЧБ принято два зачёта: спринт и
101: стайер. При этом соблюдаются следующеи правила:
102: \begin{enumerate}
103: \item Если команда сдала ответ в спринте и не сдала ответ в стайере,
104: учитывается ответ, сданный в спринте.
105: \item При равенстве количества ответов в стайере победу в стайере
106: одерживает команда, показавшая лучший результат в спринте.
107: \end{enumerate}
1.1 boris 108: \end{enumerate}
109:
110:
111: \section{Форматы}
112:
113:
114: \subsection{Письма с ответами}
115:
116: \begin{enumerate}
117: \item Каждое письмо содержит в строке Subject: строку в латиннице:
118: \begin{verbatim}
119: Subject: Otvety komandy "Nazvanie_komandy", NNN
120: \end{verbatim}
121: При этом название команды не должно содержать кавычек, а
122: \prog{NNN}---регистрационный номер команды. Если у команды еще нет
123: регистрационного номера, допускается его НЕ указывать
124: \item В теле письма может быть все, что угодно, вплоть до строки
125: \begin{verbatim}
126: *** "Название_команды", NNN
127: \end{verbatim}
128: При этом название команды может быть как в латиннице, так и в
129: кириллице, но быть \emph{одинаковым} для всех писем от данной команды
130: \item Каждый ответ имеет следующую структуру:
131: \begin{verbatim}
132: #NN. Текст ответа
133: Текст ответа
134: ...
135: \end{verbatim}
136: Здесь \prog{NN}---номер вопроса, а за ним следует текст ответа
137: (возможно, из нескольких строк)
138: \item Ответы заканчиваются строкой
139: \begin{verbatim}
140: ***
141: \end{verbatim}
142: После этой строки может следовать все, что угодно.
143: \item В тексте письма не рекомендуется употребление символов
144: ``\prog{\#}'' и ``\prog{*}'' и \emph{запрещается} их
145: употребление первыми в строке (или после пробелов).
146: \end{enumerate}
147:
148: \paragraph{Пример:}
149: \begin{verbatim}
150: Date: 12 Nov 98 18:31:53 MSK
151: From: Aleksandr Ivanov <ivanov@boga.net>
152: To: catamaran@hal.plmsc.psu.edu
153: Subject: Otvety komandy "Stop", 222
154:
155: Здравствуйте, уважаемые игроки Катамарана!
156:
157: Большое спасибо за вопросы.
158:
159: *** "Стоп", 222
160: #1. Сид
161: #2. Мышка-наружка
162: #3. Ллойд-Джордж
163: #4. В жирафа
164: #5. Шалтай-Болтай, Барклай де Толлли
165: #6. У Геркулесовых столпов.
166: #7. В коров
167: #8. Глокая куздра
168: #9. Александр Македонский и Гордий I
169: #10. Поставить точку над i.
170: #11. Кольцо Нибелунгов, Вагнер, Мефистофель
171: #12. Венера
172: ***
173:
174: Капитан команды "Стоп"
175: Александр Иванов
176: \end{verbatim}
177:
178:
179: \subsection{Формат файла с результатами}
180:
181: Файл с результатами состоит из ответов. Каждый ответ имеет следующую
182: структуру:
183: \begin{enumerate}
184: \item Заголовок
185: \begin{verbatim}
186: #NN. Frequency: f. Score: s
187: \end{verbatim}
188: Здесь \prog{NN}---номер вопроса, а \prog{s}---оценка, один из
189: трех символов: \prog{+}, \prog{-} или \prog{?}.
190: \item Собственно текст ответа:
191: \begin{verbatim}
192: Текст ответа
193: Текст ответа
194: ...
195: \end{verbatim}
196: При этом каждая строка текста начинается с двух пробелов.
197: \item В конце всех ответов идет строка из трех звездочек:
198: \begin{verbatim}
199: ***
200: \end{verbatim}
201: \end{enumerate}
202:
203:
204: \subsection{Формат таблицы результатов}
205:
2.2 boris 206: У таблицы результатов есть два формата.
207: \begin{enumerate}
208: \item Длинный формат
1.1 boris 209: \begin{verbatim}
2.7 boris 210: N 1 2 3 4 5 6 7 8 9 10 11 12 О Р КОМАНДА
211: 111 + + + + + + + + + + + + 12.04 359 Марсиане
212: 436 + + + + + + + + + + + + 12.02 359 Venera II
1.1 boris 213: [...]
214: \end{verbatim}
2.2 boris 215: \item Короткий формат
216: \begin{verbatim}
2.7 boris 217: N 123456789012 О Р КОМАНДА
218: 111 ++++++++++++ 12.04 359 Марсиане
219: 436 ++++++++++++ 12.04 359 Venera II
2.2 boris 220: [...]
221: Рейтинг
222: 1 2 3 4 5 6 7 8 9 10 11 12
223: 24 21 34 24 41 43 18 31 26 32 36 29
224: \end{verbatim}
225: \end{enumerate}
1.1 boris 226: В последних графах стоит полное число взятых вопросов и суммарный
227: рейтинг соответственно. В последней строке таблицы---рейтинги
2.2 boris 228: вопросов. В коротком формате вместо строки с рейтингом отдельная
2.7 boris 229: таблица ``Рейтинг''. В графе ``О'' стоят набранные командой очки в
230: данном зачёте (до десятичной точки) и в предыдущем (после точки).
1.1 boris 231:
232: \subsection{Формат собрания сочинений}
233:
234: Собрание ответов на каждый вопрос имеет следующую структуру:
235: \begin{enumerate}
236: \item Заголовок раздела
237: \begin{verbatim}
238: ВОПРОС NN:
239: \end{verbatim}
240: \item По два заголовка подразделов:
241: \begin{verbatim}
242: ЗАСЧИТАНЫ ОТВЕТЫ:
243: \end{verbatim}
244: и
245: \begin{verbatim}
246: НЕ ЗАСЧИТАНЫ ОТВЕТЫ:
247: \end{verbatim}
248: \item Каждый ответ имеет формат:
249: \begin{verbatim}
250: s Текст ответа
251: Текст ответа
252: ... [f]
253: \end{verbatim}
254: Здесь \prog{s}---один из символов \prog{+} или \prog{-},
255: \prog{f}---частота ответа, которая печатается только если она не равна
256: единице.
257: \end{enumerate}
258:
259:
260:
261: \section{Пользовательский интерфейс}
262:
263:
2.7 boris 264: \subsection{Файл настроек}
265: \label{sec:conf}
266:
267: Настройки программы хранятся в файле \prog{parameters.pl}. Пример
268: этого файла приведен ниже:
269: \begin{verbatim}
270: # Количество зачётов
271: $ROUNDS=2;
272:
273: ###############################################################
274: # Следующие настройки индивидуальны для каждого раунда, начиная
275: # с первого
276: ###############################################################
277:
278: # Первый раунд
279:
280: # Название раунда
281:
282: $NAME[1]="Спринт";
283:
284: # Вопросы раунда
285:
286: $MINQUEST[1]=1;
287: $MAXQUEST[1]=12;
288:
289: # Файлы раунда. Следующий перекрывает предыдущий:
290:
291: $FILES[1]='sprint.mail';
292:
293:
294: # Второй раунд
295:
296: # Название раунда
297:
298: $NAME[2]="Стайер";
299:
300: # Вопросы раунда
301:
302: $MINQUEST[2]=1;
303: $MAXQUEST[2]=18;
304:
305: # Файлы раунда. Следующий перекрывает предыдущий. Файлы разделены
306: # ПРОБЕЛАМИ
307:
308: $FILES[2]='stayer.mail';
309:
310: #########################################################
311: # Теперь общие настройки
312: #########################################################
313:
314:
315: #
316: # Адрес листа z-info
317: #
318: $address = 'z-info@chgk.info';
319: #$address="boris";
320: #
321: # Обратный адрес дежурной команды и ее название
322: #
323: $fromaddress = 'borisv@lk.net';
324: $DK = '"Дракоша"';
325: #
326: # $date -- системная процедура, которая вычисляет МОСКОВСКОЕ
327: # время. В Линуксе zdump это делает хорошо. В других операционных
328: # системах надо как-то исхитряться...
329: #
330: $date = "export TZ='Europe/Moscow'; date";
331:
332: #
333: # Процедуры, которые печатают заголовок и конец мейла-напоминания
334: #
335: sub printheader
336: {
337: print <<"END";
338: To: $address
339: From: $fromaddress
340: Subject: Svodka
341: MIME-Version: 1.0
342: Content-type: text/plain; charset=koi8-r
343: Content-Transfer-Encoding: 8bit\n
344:
345: Уважаемые знатоки!
346:
347: С вами говорит робот команды $DK
348:
349: END
350: print "На момент ", `$date`, "в зачёте '$NAME[$round]' сданы ответы от команд:\n\n";
351: }
352:
353:
354: sub printfooter
355: {
356: print <<END;
357:
358: --
359: Good luck
360:
361: -Robot
362: END
363:
364: }
365:
366: \end{verbatim}
367:
368:
1.1 boris 369: \subsection{Основная программа}
370:
371: Дежурный по туру складывает все письма в файл. Время от времени он
372: запускает команду
373: \begin{verbatim}
2.7 boris 374: processmail.pl [-d] [-t table_file] [-o results]
1.1 boris 375: \end{verbatim}
376: где
377: \begin{description}
378: \item[table\_file] файл с предыдущими оценками (по умолчанию
379: отсутствует),
380: \item[results] файл с результатами (по умолчанию---стандартный
381: выход).
382: \end{description}
383:
384: В этом файле вручную расставляются плюсы и минусы.
385:
386: Флаг \prog{-d} означает ``Debigging mode''. В этом режиме программа
387: печатает массу дополнительной информации.
388:
389: \subsection{Сводка}
390:
391: Время от времени дежурный запускает программу
392: \begin{verbatim}
2.7 boris 393: reminder.pl [-r номер_раунда]
1.1 boris 394: \end{verbatim}
395: Она генерирует список команд, которые имеются в файле с таблицей (по
2.2 boris 396: умолчанию---стандартный вход), и посылает его на z-info.
1.1 boris 397:
398:
399: \subsection{Результаты}
400:
401: Итоговая таблица и собрание сочинений генерируются программами
402: \begin{verbatim}
2.7 boris 403: createtable.pl [-d] [-s] [-t table_file] [-o results]
404: collection.pl [-d] [-t table_file] [-o results]
1.1 boris 405: \end{verbatim}
406: Ее ключи имеют то же смысл, что и у программы \prog{processmail.pl}.
2.2 boris 407: Флаг \prog{-s} означает выбор короткой формы таблицы.
1.1 boris 408:
409: \section{Программа}
410:
411:
412: \subsection{Внутреннее представление данных}
413:
414: Сведения о командах хранятся в хэше \prog{\%teams} со следующими
415: полями:
416: \begin{description}
417: \item[ключ] название команды
418: \item[элемент] ссылка на анонимный хэш \prog{\%teams\{\$team\}} с
419: полями:
420: \begin{description}
421: \item[\prog{regnum}] регистрационный номер
2.4 boris 422: \item[[\prog{numletters}] количество писем с ответами
1.1 boris 423: \item[\prog{answers}] ссылка на массив из ответов
424: \item[\prog{score}] общий итог
425: \item[\prog{rating}] общий рейтинг
426: \end{description}
427: \end{description}
428:
429: Сведения о вопросах хранятся в массиве \prog{\%answers}. Его
430: элементы---ссылки на анонимные хэши. Ключи в хэшах---тексты ответов,
431: а элементы---опять таки ссылки на хэши следующего содержания:
432: \begin{description}
433: \item[\prog{score}] \prog{+}, \prog{-} или \prog{?}
2.7 boris 434: \item[\prog{teams}] хэш команд, давших этот ответ
1.1 boris 435: \end{description}
436:
437:
438:
439: \section{Благодарности}
440:
441: Я благодарен Якову Зайдельману, Льву Горенштейну, Алексу Покрасу и
442: Дмитрию Рубинштейну за помощь в разработке этой программы.
443:
444: \end{document}
445:
446: %%% Local Variables:
447: %%% mode: latex
448: %%% TeX-master: t
449: %%% End:
450:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>