File:  [Local Repository] / processmail / process.tex
Revision 2.7: download - view: text, annotated - select for diffs - revision graph
Sun Feb 20 03:24:43 2005 UTC (19 years, 4 months ago) by boris
CVS tags: Version_3
Wrote readme

    1: %$Id: process.tex,v 2.7 2005/02/20 03:24:43 boris Exp $
    2: %$Log: process.tex,v $
    3: %Revision 2.7  2005/02/20 03:24:43  boris
    4: %Wrote readme
    5: %
    6: %Revision 2.6  2005/01/24 03:28:53  boris
    7: %Re-added
    8: %
    9: %Revision 2.4  2002/02/04 16:53:15  boris
   10: %Added numletters
   11: %
   12: %Revision 2.3  2002/02/04 16:52:37  boris
   13: %Added num
   14: %
   15: %Revision 2.2  2002/02/04 15:43:34  boris
   16: %Added new features
   17: %
   18: %Revision 2.1  2002/02/04 15:04:53  boris
   19: %Started anew
   20: %
   21: %
   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: %
   48: \usepackage[koi8-r]{inputenc}
   49: \usepackage[russian]{babel}
   50: \usepackage{t1enc}
   51: \usepackage{amsmath}
   52: \newcommand{\prog}[1]{\ensuremath{\text{{\textsl{#1}}}}}
   53: 
   54: 
   55: 
   56: \begin{document}
   57: 
   58: \title{Программа для обработки писем в ИГП и ИЧБ}
   59: \author{Boris Veytsman, \texttt{borisv@lk.net}}
   60: \date{Февраль 2005}
   61: \maketitle
   62: \thispagestyle{empty}
   63: \tableofcontents
   64: 
   65: \section{Введение}
   66: 
   67: С тех пор, как количество команд в IGP превысило первый десяток,
   68: подведение итогов тура стало тяжким бременем для дежурной
   69: команды. Прочесть невероятное количество писем, извлечь ответы,
   70: составить таблицу, да еще Собрание Сочинений\dots{} На это вполне может
   71: уйти целиком рабочий день. Именно с этой целью по предложению Якова
   72: Зайдельмана написана эта программа.  Позднее эта программа
   73: переписывалась при изменении регламента соревнований, добавлении ИЧБ и
   74: т.д. 
   75: 
   76: Идея состоит в следующем. Самый важный этап в деятельности дежурной
   77: команды---решить, заслуживает ли данный ответ плюса или минуса. Это мы
   78: автоматизировать не можем. Но это автоматизировать и не надо. А вот
   79: все остальное автоматизировать можно и нужно. Значит, программа должна
   80: делать следующее:
   81: \begin{enumerate}
   82: \item Извлекать ответы из файла с письмами команд
   83: \item Записывать их в файл, где все ответы были бы рядом, и было бы
   84:   оставлено место для оценки
   85: \item Читать этот файл \emph{после} того, как дежурная команда
   86:   проставит оценки и составлять таблицу и собрание сочинений. 
   87: \item Время от времени создавать список команд, чьи ответы уже
   88:   получены, и слать на информационный лист.
   89: \end{enumerate}
   90: Необходимо учесть еще несколько важных обстоятельств:
   91: \begin{enumerate}
   92: \item Команда может прислать несколько писем. В этом случае более
   93:   позднее письмо считается более авторитетным, чем более раннее. Мы
   94:   будем предполагать для простоты, что более поздние письма находятся
   95:   в файле с письмами позже более ранних. Дело дежурной
   96:   команды---обеспечить такой порядок писем (может быть, вручную
   97:   корректируя взбрыки e-mailа).
   98: \item Дежурная команда может оценивать ответы параллельно их
   99:   получению. Поэтому нельзя ``забывать'' старые оценки, читая новые. 
  100: \item В последнее время в ИГП и ИЧБ принято два зачёта:  спринт и
  101:   стайер.  При этом соблюдаются следующеи правила:
  102:   \begin{enumerate}
  103:   \item Если команда сдала ответ в спринте и не сдала ответ в стайере,
  104:     учитывается ответ, сданный в спринте.
  105:   \item При равенстве количества ответов в стайере победу в стайере
  106:     одерживает команда, показавшая лучший результат в спринте.
  107:   \end{enumerate}
  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: 
  206: У таблицы результатов есть два формата. 
  207: \begin{enumerate}
  208: \item Длинный формат
  209: \begin{verbatim}
  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
  213: [...]
  214: \end{verbatim}
  215: \item Короткий формат
  216: \begin{verbatim}
  217:     N  123456789012  О     Р   КОМАНДА
  218:   111  ++++++++++++  12.04 359 Марсиане
  219:   436  ++++++++++++  12.04 359 Venera II
  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}
  226: В последних графах стоит полное число взятых вопросов и суммарный
  227: рейтинг соответственно. В последней строке таблицы---рейтинги
  228: вопросов. В коротком формате вместо строки с рейтингом отдельная
  229: таблица ``Рейтинг''.  В графе ``О'' стоят набранные командой очки в
  230: данном зачёте (до десятичной точки) и в предыдущем (после точки).
  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: 
  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: 
  369: \subsection{Основная программа}
  370: 
  371: Дежурный по туру складывает все письма в файл. Время от времени он
  372: запускает команду
  373: \begin{verbatim}
  374: processmail.pl [-d] [-t table_file]  [-o results] 
  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}
  393: reminder.pl [-r номер_раунда]
  394: \end{verbatim}
  395: Она генерирует список команд, которые имеются в файле с таблицей (по
  396: умолчанию---стандартный вход), и посылает его на z-info.
  397: 
  398: 
  399: \subsection{Результаты}
  400: 
  401: Итоговая таблица и собрание сочинений генерируются программами
  402: \begin{verbatim}
  403: createtable.pl [-d] [-s] [-t table_file]  [-o results] 
  404: collection.pl  [-d] [-t table_file] [-o results] 
  405: \end{verbatim}
  406: Ее ключи имеют то же смысл, что и у программы \prog{processmail.pl}. 
  407: Флаг \prog{-s} означает выбор короткой формы таблицы.
  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}] регистрационный номер
  422:   \item[[\prog{numletters}] количество писем с ответами
  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{?}
  434: \item[\prog{teams}] хэш команд, давших этот ответ
  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>