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>