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>