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