File:  [Local Repository] / processmail / process.tex
Revision 3.0: download - view: text, annotated - select for diffs - revision graph
Sun Mar 23 17:50:50 2008 UTC (16 years, 3 months ago) by boris
Branches: MAIN
CVS tags: HEAD
Added Lev's corrections

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>