Реферат по предмету "Информатика, программирование"


Обеспечение всемирной трансляции спортивных шахматных соревнований с применением разработанного в ходе проекта законченного программного продукта

Содержание
Введение
1. Общая часть
1.1Характеристика структурного подразделения «Шахматный клуб»
1.2Обзор шахматных систем-прототипов
1.3Анализ достоинств и недостатков
1.4Техническое задание на создание информационной системы «Шахматныйклуб»
2. Специальная часть
2.1Выбор основных методологий разработки программного обеспечения
2.1.1Каскадная методология
2.1.2Экстремальная методология
2.2Выбор инструментальных средств
2.3Содержательная постановка задачи создания СШПО
2.4Разработка алгоритма решения задачи
2.5Описание разработанного программного комплекса
2.5.1Транслятор шахматных партий
2.5.2Регистратор шахматных партий
2.6Тестовые испытания и анализ результатов
3. Технико-экономическое обоснование проекта
3.1Целесообразность и область применения разработки
3.2Расчет затрат на разработку специализированного шахматного программного обеспечения
3.3Расчет эксплуатационных затрат
3.4Оценка экономической эффективности проекта
4. Безопасность и экологичность проекта
4.1Безопасность труда
4.1.1 Анализ условий труда на рабочемместе инженера структурного подразделения «Шахматный клуб» ГОУ ВПО«СибГИУ»
4.1.2Меры по безопасности труда
4.2Чрезвычайные ситуации
4.2.1Электробезопасность
4.2.2Пожарная безопасность
4.2.3Организационно-штатная структура по ГО и ЧС
4.2.4 Чрезвычайные ситуации, которыемогут возникнуть на территории ГОУ ВПО «СибГИУ»
4.2.5Способы оповещения при ЧС
4.2.6Действия по видам сообщения при передаче сигнала «Внимание всем!»
4.2.7 Организация защиты сотрудникови студентов ГОУ ВПО «СибГИУ»
привозникновении ЧС мирного и военного времени
4.3Экологическая безопасность
Заключение
Списокиспользованных источников
ПриложениеА. Календарный план работ по созданию системы
ПриложениеБ. Комплектность документации на систему
ПриложениеВ. Листинг программы-транслятора шахматных партий
ПриложениеГ. Листинг программы-регистратора шахматных партий
ПриложениеД. Снимки экрана
ПриложениеЕ. Протокол DGT
ПриложениеЖ. Общая структура транслятор шахматных партий
ПриложениеЗ. Общая структура регистратора шахматных партий
ПриложениеИ. Анализ результатов тестовых испытаний
ПриложениеК. Листинг модуля вещания шахматных партий

Введение
В настоящее время во всеммире резко возросло число спортивных шахматных соревнований высокого и среднегоуровня. Это способствует резкому росту общественного интереса к данному видуспорта и накладывает требование широкого освещения подобных событий в средствахмассовой информации и сети Интернет. Для этих целей в настоящее время активноиспользуются информационные системы, оснащенные электронными шахматными доскамии оборудованием для отображения информации. Однако все подобные системы имеютряд существенных недостатков. Все они вытекают в основном из отсутствия рынкаинформационных шахматных систем. Во-первых, большую сложность представляетзакупка оборудования для информационных шахматных систем, так как его поставкойв мире занимается только 3 организации, и велик перечень требований, которыенеобходимо указать при заказе. Во-вторых, отсутствует свободно распространяемоепрограммное обеспечения для подобных систем.
В данном дипломномпроекте приводится пример создания информационной шахматной системы и делаетсяпопытка создания для нее программного обеспечения.
Целью дипломного проектав первую очередь является обеспечение всемирной трансляции спортивных шахматныхсоревнований с применением разработанного в ходе проекта законченногопрограммного продукта. В дальнейшем планируется коммерческое использованиеданной разработки.

1. Общая часть
1.1Характеристика СП «ШК»
Структурное подразделение«Шахматный клуб» входит в состав государственного образовательного учреждениявысшего профессионального образования «Сибирский государственный индустриальныйуниверситет» (ГОУ ВПО «СибГИУ»). Помещение шахматного клуба является полигономкафедры «Физического воспитания, здоровья и спорта» (ФВЗиС) для проведениязанятий по дисциплине «Шахматы» для студентов, по состоянию здоровья непригодных к занятиям физической культурой в основной учебной группе. Внастоящее время в помещении структурного подразделения «Шахматный клуб» (СП«ШК») занимается около 300 студентов и сотрудников университета. Изменениеколичества студентов, занимающихся в помещении СП «ШК» по дисциплине «Шахматы»за последние 5 лет отражает рисунок 1.
/>
Рисунок 1 – Изменениечисла студентов, обучающихся по дисциплине «Шахматы»

Таким образом, числостудентов, занимающихся по дисциплине «Шахматы» за последние 5 лет стабильно непретерпевает резких изменений.
Помимо этого, помещениеСП «ШК» является базой для проведения соревнований по шахматам различного уровня:от внутригородских до международных.
Учебный процесс подисциплине «Шахматы» осуществляется в соответствии с учебным планом занятийкафедры ФВЗиС. Правила шахматной игры и правила проведения шахматныхсоревнований регулируются кодексом международной шахматной федерации ФИДЕ.
Процесс проведениясоревнований по шахматам в помещении СП «ШК» осуществляется в соответствии скалендарным планом проведения соревнований на текущий год, а также всотрудничестве с городским муниципальным учреждением дополнительногообразования детей «Специализированной детско-юношеской спортивной школойОлимпийского резерва по шахматам имени Б. А. Кустова» (МУДОД «СДЮСШОР пошахматам»).
Корпус СП «ШК» включает всебя следующие помещения: основной турнирный зал, судейская, раздевалка,преподавательская, малый турнирный зал, кабинет директора, подсобное помещение,туалетные комнаты. СП «ШК» оснащено следующим инвентарём: шахматные столы – 53штуки; комплекты шахмат – 40 штук; шахматные часы – 40 штук. Обслуживающийперсонал шахматного клуба: директор, ведущий инженер, две технички. Занятия впомещении СП «ШК» проводят 3 преподавателя кафедры физической культуры,здоровья и спорта. Во время проведения спортивных соревнований в случаенехватки инвентаря и оборудования все необходимое предоставляется вбезвозмездное пользование на период соревнований городским МУДОД «СДЮСШОР пошахматам». Нехватка персонала на период спортивных состязаний компенсируетсяпутем командировки работников городского МУДОД «СДЮСШОР по шахматам» наобслуживание и судейство соревновательного процесса, а также путем привлечениястудентов-разрядников на волонтерских началах. Организационная структура СП«ШК», включающая работников смежных подразделений и учреждений, представлена нарисунке 2.
/>
Рисунок 2 –Организационная структура СП «ШК»
За последнее время резковозросло число соревнований, проводимых в помещении СП «ШК». В сотрудничестве сгородским МУДОД «СДЮСШОР по шахматам» в помещении СП «ШК» только за 2007 годбыли проведены следующие городские соревнования по шахматам:
·         первая лигаг.Новокузнецка по шахматам среди мужчин;
·         первая лигаг.Новокузнецка по шахматам среди женщин;
·          лично-командныйстуденческий чемпионат ГОУ ВПО «СибГИУ» по шахматам среди факультетов;
·          лично-командныйпреподавательский чемпионат ГОУ ВПО «СибГИУ» по шахматам среди факультетов;
·          чемпионат г.Новокузнецка по шахматам среди ветеранов;
·         традиционнаялетняя городская Спартакиада;
·         турнир по быстрымшахматам среди студентов;
·         первенство городапо блицу среди студентов;
внутригородские шахматныесоревнования, приуроченные к различным праздникам:
·         традиционныйновогодний блицтурнир;
·         блиц турнир коДню Победы среди студентов;
·         блиц турнир коДню Победы среди ветеранов;
·         рождественскийшахматный турнир;
·         турнир,посвященный 8 марта;
·         турнир,посвященный 23 февраля;
соревнования отобластного до международного уровня:
·         чемпионат СФО пошахматам среди мальчиков до 8 лет;
·         чемпионат СФО пошахматам среди девочек до 8 лет;
·         чемпионат СФО пошахматам среди мальчиков до 10 лет;
·         чемпионат СФОсреди мальчиков до 10 лет по быстрым шахматам;
·         чемпионат СФО пошахматам среди девочек до 10 лет;
·         чемпионат СФОсреди девочек до 10 лет по быстрым шахматам;
·         чемпионат СФО пошахматам среди мальчиков до 12 лет;
·         чемпионат СФОсреди мальчиков до 12 лет по быстрым шахматам;
·         чемпионат СФО пошахматам среди девочек до 12 лет;
·         чемпионат СФОсреди девочек до 12 лет по быстрым шахматам;
·         чемпионат СФО пошахматам среди мужчин;
·         чемпионат СФО пошахматам среди женщин;
·         областнаяспартакиада ВУЗов Кузбасса (студенты);
·         областнаяспартакиада ВУЗов Кузбасса (преподаватели);
·         областнойкомандный турнир ветеранов в честь Дня Победы;
·         традиционныймеждународный турнир памяти Толстогузова, мужчины;
·         традиционныймеждународный турнир памяти Толстогузова, женщины;
·          традиционныймеждународный турнир памяти Толстогузова, преподаватели ВУЗов;
·         первенство областипо шахматам среди мальчиков до 8 лет;
·         первенство областипо шахматам среди девочек до 8 лет;
·         первенствообласти по шахматам среди мальчиков до 10 лет;
·         первенствообласти среди мальчиков до 10 лет по быстрым шахматам;
·         первенствообласти по шахматам среди девочек до 10 лет;
·         первенство областисреди девочек до 10 лет по быстрым шахматам;
·         первенствообласти по шахматам среди мальчиков до 12 лет;
·         первенствообласти среди мальчиков до 12 лет по быстрым шахматам;
·         первенствообласти по шахматам среди девочек до 12 лет;
·         первенство областисреди девочек до 12 лет по быстрым шахматам;
За последнее времяработниками СП «ШК» в сотрудничестве с городским МУДОД «СДЮСШОР по шахматам»были проведены следующие крупнейшие международные шахматные форумы:
·          лично-командныйчемпионат России по шахматам среди студентов ВУЗов;
·          лично-командныйчемпионат Мира по шахматам среди студентов ВУЗов (во время написания дипломнойработы данный шахматный форум находился на стадии подготовки).
На чемпионате России пошахматам среди студентов ВУЗов команде ГОУ ВПО «СибГИУ» (в составе которой были автор данной дипломной работы; тренер команды – мастер международного классапо шахматам, преподаватель кафедры физического воспитания, здоровья и спортаЗайцев В. В.) удалось стать бронзовыми призерами. А, немного забегая вперед, налично-командном чемпионате Мира по шахматам среди студентов ВУЗов сборнаястуденческая команда России, в составе которой выступали от ГОУ ВПО «СибГИУ»два представителя, выступила очень успешно, с крупным отрывом обогнав ближайшихконкурентов, сборную команду Китая, и победив на этом грандиозном спортивномсостязании.
В ближайшее время в г.Новокузнецке планируется провести еще ряд крупнейших шахматных состязаний, воттолько несколько из них:
·          чемпионат СФО пошахматам среди юниоров по классическим и быстрым шахматам (все возрастныекатегории – до 8, до 10, до 12, до 14, до 16, до 18 лет; и среди юношей и средидевушек. Таким образом – 22 турнира, включая турниры по быстрым шахматам.Причем одновременно будет проводиться сначала 12 турниров по классическимшахматам, а затем 10 турниров по быстрым шахматам);
·          высшая лигачемпионата России среди мужчин и женщин (один из сильнейших шахматных форумовРоссии и мира, раньше традиционно проводящийся в г.Сочи).
Помимо всеговышесказанного, в ходе работы структурного подразделения «Шахматный клуб» всотрудничестве с городским МУДОД «СДЮСШОР по шахматам» сложилась хорошаятрадиция – отправлять в качестве поощрения лучших студентов спортсменов на международныесоревнования за границу. Для реализации данной идеи привлекаются спонсорскиесредства, средства ГОУ ВПО «СибГИУ», средства городского МУДОД «СДЮСШОР пошахматам». География шахматных турниров, в которых участвовали спортсмены ГОУВПО «СибГИУ» действительно впечатляет:
·          Малайзия. 2003год. Лично-командный чемпионат Мира по шахматам среди студентов ВУЗов;
·         Чехия. 2005 год.Европейский международный турнир;
·         Хорватия 2006год. Европейский международный турнир;
·         Албания 2007 год.Европейский международный турнир;
·         Греция 2008 год.Европейский международный турнир (планируется).
Кроме этого, команда ГОУВПО «СибГИУ» в полном составе регулярно выезжает на крупные спортивныесостязания на территории России. Вот только некоторые традиционно посещаемыекомандой ГОУ ВПО «СибГИУ» по шахматам спортивные форумы:
·          областнаяспартакиада ВУЗов Кузбасса (проводится попеременно в г.Новокузнецке и вг.Кемерово);
·          чемпионат Россиипо шахматам среди студентов ВУЗов (проводится каждый раз в разных городах.Несколько последних турниров проводилось в: г.Новокузнецке, г.Нижнем Тагиле,г.Уфа);
·          традиционныймеждународный шахматный фестиваль «Маэстро», г. Берцк;
·          чемпионат СФО пошахматам среди мужчин и женщин (проводится каждый раз в разных городах.Несколько последних турниров проводилось в: г. Новокузнецке, г. Ангарске, г.Улан-Удэ, г.Томске).
В СП «ШК» занятия подисциплине «Шахматы» ведутся весьма квалифицированными преподавателями. Двоепреподавателей имеют высокие международные звания. Это мастер международногокласса по шахматам Сорокина Т. Н. и мастер международного класса по шахматамЗайцев В. В. Преподаватели СП «ШК» активно участвуют в спортивной жизни города,области, страны и мира, показывая наглядный пример студентам ВУЗа. Географиясоревнований, в которых участвовали и участвуют преподаватели ГОУ ВПО «СибГИУ»достаточно широка и насчитывает более десятка стран.
На основании анализаитогов работы СП «ШК» ГОУ ВПО «СибГИУ» был сделан вывод о необходимостисоздания специализированной информационной шахматной системы, обеспечивающейнормальный процесс проведения спортивных соревнований, освещения их дляширокого круга наблюдателей, подготовки студентов-спортсменов к высшимспортивным достижениям.
1.2         Обзор шахматныхсистем прототипов
В настоящее время рынокшахматных информационных систем практически отсутствует. Поэтому отсутствует имассовое серийное производство подобных систем. Электронное шахматноеоборудование во всем мире можно приобрести только у 3 организаций:
·             Фирма «Шахком»,генеральный директор Борис Ешан, Санкт-Петербург.
·             Информационныйшахматный центр российской шахматной федерации, Москва.
·             Международнаяшахматная федерация ФИДЕ.
Электронное шахматноеоборудование в свободной продаже практически отсутствует. Его необходимозаказывать индивидуально, указывая необходимую комплектацию и свои пожелания.Сроки поставки оборудования могут варьироваться от нескольких дней донескольких месяцев, в зависимости от дальности поставки. Бесплатное сервисноеобслуживания для этого оборудования не предусмотрено. Все эти обстоятельствасильно осложняют создание подобных систем в географически удаленных отцентральной части России регионах.
До настоящего времениподавляющее большинство создаваемых информационных шахматных системпредставляло собой миниатюрный вариант, состоящий из небольшого числаэлектронных шахматных досок (ЭШД), от 2 до 10 штук, соединенных илинесоединенных между собой и подключаемых к компьютеру через стандартный сom-порт; одного или двух проекторов, спомощью которых собственно отображались шахматные партии. Если это крупнейшиемеждународные шахматные форумы, обслуживаемые международной шахматнойфедерацией ФИДЕ или информационным шахматным центром России, то подобныесоревнования освещаются и транслируются в сети Интернет на таких шахматныхсайтах, как:
·          www.chesspro.ru;
·          www.fide.com;
·          www.russiachess.org;
·          www.chesscenter.com;
·          www.64.ru;
·          www.russiachess.org.
Однако не в интересахспециалистов международной шахматной федерации ФИДЕ и информационногошахматного центра России предоставлять в пользование или продаватьспециализированное программное обеспечение (СПО) для трансляции соревнований всети Интернет, так как подобное СПО является объектом их интеллектуальнойсобственности и используется ими для обслуживания турниров в случае приглашениясотрудников этой организации.
В качестве системпрототипов информационной системы «Шахматный клуб» (ИС «ШК») приведем двесистемы.
а)           Программно-техническийкомплекс, обеспечивающий трансляцию шахматных соревнований для присутствующейаудитории, Нижний Тагил, 2005 год, чемпионат России по шахматам среди студентов
Данныйпрограммно-технический комплекс (ПТК) представляет собой набор из следующихтехнических и программных средств:
·          4 ЭШД DGT;
·          4 комплекта фигурдля ЭШД;
·          4 единицыэлектронных шахматных часов;
·          персональныйкомпьютер (ПК);
·          1 проектор;
·          соединительныепровода и переходники;
·          программный пакетChessAssistant9.1;
·          драйвер дляэлектронной шахматной доски dgtnix.
Электронные шахматныедоски и электронные шахматные часы при помощи поставляемых в комплекте с нимипереходников с com интерфейса настандартный сетевой кабель, подключаются к магистральному проводу, который припомощи также поставляемого в комплекте переходника подключается к компьютеручерез стандартный com-порт. Вкачестве магистрального провода используется кабель RJ45. Поступающая с электронных шахматных досок информацияпакетами поступает на компьютер в программный продукт ChessAssistant9.1, причем процесс опросастандартного com-порта инициируется драйвером dgtnix для электронных шахматных досок, апередача данных осуществляется с использованием протокола DGT. Поступающая информация сохраняетсяв отдельной базе данных программного продукта ChessAssistant9.1. Она включает в себя такие данныео шахматной партии, как:
·             фамилия, имя,отчество игроков;
·             результат партии;
·             классификациядебюта шахматной партии;
·             дата шахматнойпартии;
·             город, страна гдеигралась шахматная партия;
·             номер тура;
·             название, ранг,статус соревнований;
·             комментарии;
·             международныезвания и рейтинги игроков;
·             непосредственносам текст шахматной партии и т.д.
Далее информация,поступившая в базу данных программного продукта ChessAssistant9.1, выводится на проектор иотображается в зрительном зале для присутствующей аудитории.
б)           Программно-техническийкомплекс, обеспечивающий трансляцию шахматных соревнований для присутствующейаудитории и в сети Интернет, Москва, 2007 год, международный шахматный турнир«Аэрофлот-опен 2007»
Данный ПТК создавался и обслуживалсяспециалистами информационного шахматного центра российской шахматной федерации.Поэтому полная информация о данном ПТК отсутствует. В качестве программногообеспечения для данной системы использовалось СПО, являющееся объектоминтеллектуальной собственности.
Данный ПТК представляетсобой набор из следующих технических и программных средств:
·          16 ЭШД DGT;
·          16 комплектовфигур для ЭШД;
·          16 единицэлектронных шахматных часов;
·          2 ноутбука;
·          2 проектора;
·          соединительныепровода и переходники;
·          СПО,обеспечивающее трансляцию соревнований для присутствующей аудитории и в сетиИнтернет;
·          драйвер дляэлектронной шахматной доски dgtnix.
Данный ПТК отличается отпредыдущего бόльшим количеством комплектов ЭШД и единиц оборудования, атакже возможностью трансляции спортивных соревнований в сети Интернет.
В представленной системеиспользуется 2 магистральных провода, к каждому из которых подключается по 8ЭШД. Магистральные провода, в качестве которых также используются кабели RJ45, подключаются к 2 ноутбукам,имеющим выход в сеть Интернет. Трансляция в сети интернет осуществляется сиспользованием СПО, являющегося объектом интеллектуальной собственности. Весьпроцесс соревнований также транслируется для присутствующей аудитории сиспользованием 2 проекторов. Схема подключения ЭШД подобна уже рассмотреннойсхеме подключения, технология передачи данных аналогична.
В общем виде работарассмотренного ПТК представлена на рисунке 4.
/>

/>/>Рисунок 4 – Иллюстрация работы ПТК,обеспечивающего трансляцию соревнований для присутствующей аудитории и в сетиинтернет

1.3     Анализ достоинств и недостатков
Рассмотренные шахматныесистемы прототипы обладают рядом достоинств и недостатков. Некоторые из нихсвойственны только этому классу систем, а некоторые характерны для любыхподобных систем.
Достоинствами подобныхсистем являются:
·    шахматные ИСспособствуют повышению интереса общественности к данному интеллектуальному видуспорта, привлечению молодежи к спортивной жизни страны и мира;
·    шахматные ИСспособствуют привлечению спонсорских средств, что делает подобные системыэкономически привлекательными;
·    ИС подобногокласса способствуют привлечению большого числа людей для участия в крупныхспортивных состязаниях, что является большим плюсом для экономики города ирегиона, в котором проводятся подобные форумы;
·    подобные ИСспособствуют повышению общей культуры проведения спортивных состязаний,эргономики и судейской деятельности;
·    информационныешахматные системы (ИШС) способны организовывать моментальный перенос играющихсяпартий в электронную форму и осуществлять транслирование спортивных состязанийв режиме он-лайн (on-line) по всему миру через сеть Интернет;
·    ИШС являютсянезаменимым помощником в случае возникновения спорных ситуаций и конфликтов,так как позиции играющихся партий сохраняются даже в случае полного нарушениярасстановки фигур на шахматной доске;
·    ИШС позволяютпреодолеть ограниченность вмещаемости помещения, в котором проводятсяспортивные состязания;
·    данные ИСпозволяют издавать подробные отчеты об итогах спортивных состязаний практическина следующий день после окончания турнира;
·    подобные системыделают процесс, происходящий на шахматной доске, предельно понятным даже длялюдей, не знакомых хорошо с принципами игры; это достигается подключением анализируемыхигровых и комментирующих программных модулей, что предусмотрено возможностямиподобных систем.
К недостаткамрассмотренных шахматных систем прототипов, а также большинства подобных систем,относятся:
·    сложностьсоздания подобных систем, обусловленная следующими факторами:
o  отсутствие оборудования для подобныхсистем в свободной продаже;
o  большой перечень требований, которыенеобходимо указать при заказе необходимого оборудования;
o  сложности по доставке оборудования врегионы, удаленные от центральной части страны;
o  отсутствие бесплатного сервисногообслуживания;
o  сложность замены бракованногооборудования вследствие большой удаленности фирмы производителя и фирмыпоставщика;
·    оченьограниченное число эксплуатируемых ЭШД, что делает использование подобныхсистем узконаправленным на трансляцию только нескольких первых партийсоревнования; подобное обстоятельство делает невозможным проведениеполномасштабных транслируемых соревнований и затрудняет создание всевозможныхпечатных отчетов об итогах турниров;
·    так как рынокподобных систем является монополизированным, то фирмы монополисты самиустанавливают стоимость лицензии на использование оборудования;
·    отсутствует всвободной продаже СПО для подобных систем, поэтому приходится надеяться на работоспособностьСПО, поставляемого в комплекте с ЭШД.

1.4 Техническое заданиена создание ИС «ШК»
1.4.1 Общие сведения
а) Наименование системы –информационная система «Шахматный клуб» ГОУ ВПО «Сибирский государственныйиндустриальный университет».
б) Разработчик:
Студент
Группа АИС-03, ГОУ ВПО«СибГИУ»
Ширяев А.С.
Адрес: 654041, г. Новокузнецк, ул. Циолковского 32-22,
Телефон: (8-3843)71-27-63
E-mail: jamert3@yandex.ru
Заказчики:
ГОУ ВПО «Сибирскийгосударственный индустриальный университет»
МУДОД «СДЮСШОР пошахматам им. Б. А. Кустова»
Адреса заказчиков:
г. Новокузнецк, ул.Кирова 42,
г. Новокузнецк, ул.Орджоникидзе 23.
Телефоны заказчиков:(8-3843) 46-33-35, (8-3843) 45-36-98.
в) Система создается всвязи с необходимостью оснащения СП ГОУ ВПО «СибГИУ» оборудованием дляпроведения учебного процесса и процесса проведения соревнований.
г) Плановые сроки началаработ по созданию системы: 01.08.07.
 Плановые сроки окончанияработ по созданию системы: 13.03.08.
д) Результаты работ посозданию системы представлены в приложении 1.

1.4.2 Назначение и целисоздания системы
1.4.2.1 Назначениесистемы
ИС «ШК» предназначена длявыполнения функций, обеспечивающих более эффективное проведение учебногопроцесса, а также соревнований, в помещении СП «ШК» ГОУ ВПО «СибГИУ», а именно:
-    трансляция шахматныхпартий в режиме реального времени для присутствующей аудитории и в сетиИнтернет;
-    снижениетрудозатрат на освещение турниров в средствах массовой информации;
-    предоставлениеисчерпывающей информации по каждому участнику соревнований по первому запросу;
-    организациямоментального переноса записи шахматных партий в электронную форму;
-    отображениешахматных партий, турнирного положения, различного рода статистическойинформации на специализированных экранах и электронных стендах для широкойаудитории;
-    хранение данных окаждом участнике соревнований, турнирной и прочей информации;
-    оперативнаяобработка всей поступающей информации и выдача всех необходимых длясоревнований данных;
-    организациявыдачи в оперативном режиме информации по спорным вопросам, возникающим в ходеигрового процесса;
-    организациякомпьютеризированного процесса обучения игре в шахматы.
1.4.2.2 Цели созданиясистемы
Цель складывается изследующих составляющих:
-          информатизацияпроцесса шахматной игры;
-          автоматизация:
ü  процесса сборки,
ü  отображения,
ü  хранения,
ü  обработки специализированнойшахматной информации;
-          облегчение работысудейской коллегии в процессе соревнований;
-          автоматизацияпроцесса обучения.
1.4.3 Характеристикаобъекта информатизации
Объектом информатизацииявляется процесс шахматной игры. Правила шахматной игры и правила проведенияшахматных соревнований регулируются кодексом международной шахматной федерацииФИДЕ.
Объектом информатизациитакже является учебный процесс на кафедре ФКЗиС ГОУ ВПО «СибГИУ» по дисциплине«Шахматы». Данный учебный процесс осуществляется в соответствии с учебнымпланом занятий.
Процесс проведениясоревнований по шахматам осуществляется в соответствии с календарным планомпроведения соревнований на текущий год.
Учебный процесс подисциплине «Шахматы» проводится в помещении СП «ШК» ГОУ ВПО «СибГИУ». ПомещениеСП «ШК» ГОУ ВПО «СибГИУ» включает в себя следующие помещения: турнирный зал,судейский кабинет, раздевалка, помещение для инвентаря, комната анализа,кабинет директора. Шахматный клуб ГОУ ВПО «СибГИУ» оснащен следующиминвентарём: шахматные столы – 53 штук; комплекты шахмат – 40 штук; шахматныечасы – 40 штук.
1.4.4 Требования ксистеме
1.4.4.1 Требования ксистеме в целом
а) Требования к структуреи функционированию системы
ИС «ШК» представленапятью подсистемами:
-          интегрирующаяподсистема;
-          подсистема сбораинформации;
-          подсистемаобработки и хранения информации;
-          подсистемаотображения информации;
-          обучающаяподсистема.
Интегрирующая подсистемав общем виде представляет собой сетевую структуру, охватывающую все остальныеподсистемы. Поэтому она является наиболее важной из всех остальных подсистем.Конфигурация оборудования подсистемы следующая:
—   1 сервер дляхранения информации и обработки запросов;
—   соединительныепровода;
—   1 коммутатор D-Link DGS-1008D;
—   6 рабочихкомпьютеров для работы с информацией, поступающей на сервер в оперативномрежиме,
—   периферийныеустройства:
ü  многофункциональное устройство,
ü  микрофон,
ü  веб-камера и др.
Подсистема сбора информациив общем виде представляет собой все устройства, на которые поступает первичнаяи вторичная информация. Эта подсистема включает в себя следующие части:
—   ЭШД в количестве30 штук,
—   интернет илокальнаю сеть ГОУ ВПО «СибГИУ»,
—   фотоаппаратура ипрочее оборудование.
ЭШД представляют собойкомплекты шахматных фигур с досками и шахматными часами, соединённые при помощисоединительных проводов и переходников с компьютером. Передача данных,поступающих с шахматных досок, осуществляется при помощи протокола DGT. Процесс, происходящий во время игрыза шахматной доской, полностью переносится в электронную форму при помощи СПО.Количество подключаемых ЭШД определяется потребностями соревновательногопроцесса, но общее их число 30 штук. Интернет и локальная сеть ГОУ ВПО «СибГИУ»– необходимые источники информации. Отсюда будет поступать информации самогоразличного рода: отзывы, комментарии, предложения, любительское фото и видео.
Подсистема обработки ихранения информации включает в себя:
—   обработку и хранениешахматной информации;
—   обработку ихранение прочей информации.
Подсистема обработки ихранения шахматной информации представляет собой набор СПО для проведениятурниров, хранения и классифицирования шахматной информации, СПО дляобслуживания электронных досок. В качестве СПО для проведения турнировиспользуется набор из следующих программных продуктов:
ü  судейская программа SwissMaster 5.5 в количестве 2 лицензионныхверсий;
ü  многофункциональный пакет ChessAssistant9.1 в количестве 6 лицензионных версий
ü  многофункциональный пакет ChessBase9 в количестве 3 лицензионных версий.
Для обслуживания ЭШДиспользуется программное обеспечение, поставляемое с ними в комплекте.
Подсистема обработки ихранения прочей информации представляет собой пакет стандартных программ дляработы с графикой.
Подсистема отображенияинформации включает в себя:
ü   трансляцию соревнований в сетиИнтернет;
ü   трансляцию соревнований дляприсутствующей аудитории.
Так как используется СПОдля ЭШД, поставляемое с ними в комплекте, то не возникает необходимости вдополнительном СПО для трансляции соревнований в сети Интернет по той причине,что означенное СПО уже содержит все для этого необходимое.
В качестве техническихсредств, обеспечивающих трансляцию соревнований для присутствующей аудитории,используется существующее оборудование, а именно – плазменные мониторы,установленные по университету, электронные стенды и проекторы: 1 электронныйстенд и проектор в турнирном зале и 1 электронный стенд и проектор натерритории ГОУ ВПО «СибГИУ».
Подсистема отображенияинформации, помимо выполнения своей главной функции – трансляции соревнованийдля присутствующей аудитории и в сети Интернет – может быть использована врекламных целях.
Обучающая подсистемапредставляет собой набор программных средств для обучения шахматной игре,тренировки, игры в шахматы через сеть Интернет и по локальной сети ГОУ ВПО«СибГИУ». В качестве программного обеспечения используется:
ü  программный пакет ChessAssistant9.1 (имеющееся в наличии);
ü  программный пакет ChessBase9 (имеющееся в наличии);
ü  обучающая программа Studies2.0 (6 лицензионных версий);
ü  обучающая программа «Шахматныекомбинации» (6 лицензионных версий);
ü  обучающая программа «ШахматнаяСтратегия» (6 лицензионных версий);
ü  обучающая программа «Шахматная школа»(6 лицензионных версий);
ü  программа для игры в шахматы по сетиИнтернет «ChessPlanet».
Более наглядно общаяструктура ИС «ШК» представлена в графической части дипломного проекта, на листе3.
Структура ИС «Шахматныйклуб» может быть дополнена новыми подсистемами, модулями и оборудованием, еслина то возникнет необходимость. Численность единиц техники и программногообеспечения может меняться в зависимости от объемов финансирования.
б) Требования кчисленности и квалификации персонала системы и режиму его работы
К эксплуатациидопускается персонал, изучивший инструкцию по эксплуатации.
Квалификация персоналадолжна обеспечивать эффективное функционирование системы во всех заданныхрежимах. Численность персонала должна быть достаточной для обеспечениявыполнения всех функций системы.
Персонал должен бытьподготовлен к выполнению своих обязанностей в соответствии с инструкциямиорганизационного обеспечения.
Каждое лицо, входящее всостав персонала, должно уметь применять соответствующие информационные моделии работать с используемыми им техническими средствами и документацией,определяющей порядок его деятельности.
в) Показатели назначения
Время реализации системына инициативы пользователя по запросам на выдачу информации, ввод информации,обновление не должно превышать 3 секунд.
Время запаздываниясистемы при переводе шахматной партии в электронную форму и отображении ее дляширокого круга наблюдателей в процессе соревнований не должно превышать 0,5секунд, если заранее не предусмотрена регламентированная задержка.
Структура комплексатехнических средств, функциональные возможности и программное обеспечениедолжны быть реализованы с учетом возможности дальнейшего развития.
г) Требования кнадежности
Технические средствасистемы должны работать в условиях реального времени в процессе проведениясоревнований в течении всего рабочего дня с периодическим техническимобслуживанием.
Технические средствасистемы должны работать в оперативном режиме в ходе учебного процесса, чтоподразумевает обращение к средствам системы по мере возникновениянеобходимости.
Среднее времявосстановления функций системы в процессе проведения соревнований не должнопревышать 10 минут.
Среднее времявосстановления функций системы в ходе учебного процесса не должно превышать 1 суток.
Время наработки на отказтехнических и программных средств не должно превышать 5 лет.
Требования по надежностифункционирования должны уточняться на последующих этапах проектирования.
д) Требованиябезопасности
Требования побезопасности при монтаже, наладке и эксплуатации оборудования должнысоответствовать следующим документам:
-          ГОСТ 12.1.004-85«ССБТ. Пожарная безопасность. Общие правила».
-          СанПин2.2.2.542-96 «Гигиенические требования к видеодисплейным терминаламвычислительных машин».
-          Нормы освещенностидолжны быть обеспечены в соответствии с СНиП 11-4-79.
е) Требования кэргономике и технической эстетике
Размещение техническихсредств, а также формы представления оперативной информации должнысоответствовать ГОСТу 22.269-76.
Общие эргономическиетребования к микроклимату рабочих помещений персонала должны соответствоватьГОСТу 12.1.005-76.
Оборудование системыдолжно быть скомпоновано из серийно выпускаемых технических средств.
Способ и формапредставления информации оперативному персоналу должна соответствоватьтребованиям эргономики ГОСТ 22.269-76.
ж) Требования поэксплуатации, техническому обслуживанию, ремонту и хранению
При разработке ИС «ШК»необходимо предусмотреть проведение технического обслуживания используемогооборудования на месте его эксплуатации. Техническое обслуживание проводится сцелью предупреждения отказов в работе системы.
Периодичность проведениятехнического обслуживания зависит от вида и назначения устройств иустанавливается согласно техническому описанию и инструкции по эксплуатации длякаждого элемента. Для быстрой замены вышедших из строя устройств и блоковнеобходимо предусмотреть запасные блоки, резервные каналы данных.
з) Требования посохранности информации при авариях
Для обеспечениясохранности информации при резких изменениях и исчезновениях напряжения впитающей сети, отказах сервера, попаданиях в систему вируса, отказахкомпьютеров и других технических средств необходимо предусмотреть:
-          автоматическоеархивирование;
-          использованиесредств защиты информации;
-          анализ отказов ивосстановление данных.
и) Требования к защите отвлияния внешних воздействий
Защита техническихсредств ИС «ШК» от воздействия внешних электрических и магнитных полей, а такжепомех по цепям питания должна быть достаточной для надежного функционированиясистемы. В ИС «ШК» должна быть предусмотрена антивирусная защита и защита отнесанкционированного доступа, достаточная для надежного, бесперебойногофункционирования системы.
к) Требования к патентнойчистоте
Разрабатываемая системане предназначена для экспорта, поэтому проверка используемых техническихрешений на патентную чистоту не требуется.
1.4.4.2 Требования кфункциям системы
ИС «ШК» в соответствии сГОСТ 24.104-85 должна выполнять:
-          сбор, обработку ианализ информации (сигналов, сообщений, документов и т.п.) о состоянии объектауправления;
-          выработкууправляющих воздействий (программ, планов и т.п.);
-          передачууправляющих воздействий на исполнение и их контроль;
-          реализацию иконтроль выполнения управляющих воздействий;
-          обмен информацией(документами, сообщениями и т.п.) с взаимосвязанными автоматизированнымисистемами.
Состав автоматизированныхфункций и функций по представлению информации ИС «ШК» должен обеспечиватьвозможность управления соответствующим объектом и представлением информации.
Состав автоматизированныхфункций, функций по представлению информации ИС «ШК» и степень информативностиотображаемых данных должны быть технико-экономически и социально обоснованы сучетом необходимости освобождения персонала от выполнения повторяющихсядействий и создания условий для использования его творческих способностей впроцессе работы.
1.4.4.3 Требования квидам обеспечения
а) Требования кинформационному обеспечению
Информационноеобеспечение ИС «ШК» должно быть достаточным для выполнения всехавтоматизированных и информативных функций данной системы.
Информационноеобеспечение ИС «ШК» должно быть совместимо с информационным обеспечениемсистем, взаимодействующих с ней, по содержанию, системе кодирования, методамадресования, форматам данных и форме представления информации, получаемой ивыдаваемой ИС «ШК».
б) Требования кпрограммному обеспечению
Программное обеспечениеИС «ШК» должно быть достаточным для выполнения всех функций этой системы,реализуемых с применением средств вычислительной техники, а также иметьсредства организации всех требуемых процессов обработки и представления данных,позволяющие своевременно выполнять все автоматизированные и информативныефункции во всех регламентированных режимах функционирования ИС «ШК».
в) Требования ктехническому обеспечению
Комплекс техническихсредств ИС «ШК» должен быть достаточным для выполнения всех автоматизированныхфункций и функций по представлению информации.
В комплексе техническихсредств ИС «ШК» должны использоваться технические средства серийногопроизводства. При необходимости допускается применение технических средствединичного производства.
Технические средства ИС«ШК» должны быть размещены с соблюдением требований, содержащихся втехнической, в том числе эксплуатационной, документации на них, и так, чтобыбыло удобно использовать их при функционировании ИС «ШК» и выполнятьтехническое обслуживание.
Технические средства ИС«ШК», используемые при ее взаимодействии с другими системами, должны бытьсовместимы по интерфейсам с соответствующими техническими средствами этихсистем и используемых систем связи.
В ИС «ШК» должны бытьиспользованы технические средства со сроком службы не менее пяти лет.
В ИС «ШК» должны бытьиспользованы средства вычислительной техники, удовлетворяющие общим техническимтребованиям по ГОСТу 22552-84.
г) Требования клингвистическому обеспечению
Лингвистическоеобеспечение системы должно быть достаточным для общения различных категорийпользователей в удобной для них форме со средствами ИС «ШК» и для осуществленияпроцедур преобразования и машинного представления обрабатываемой информации.
В лингвистическомобеспечении ИС должны быть:
-       предусмотреныязыковые средства для описания любой используемой информации;
-       унифицированыиспользуемые языковые средства;
-       стандартизированыописания однотипных элементов информации и записи синтаксических конструкций;
-       обеспеченыудобство, однозначность и устойчивость общения пользователей со средствамиавтоматизации и представления информации;
-       предусмотренысредства исправления ошибок, возникающих при общении пользователей стехническими средствами ИС.
Лингвистическоеобеспечение ИС «ШК» должно быть отражено в документации организационногообеспечения системы в виде правил общения пользователей с техническимисредствами ИС «ШК» во всех режимах функционирования системы.
д) Требования корганизационному обеспечению
Организационноеобеспечение ИС «ШК» должно быть достаточным для эффективного выполненияперсоналом возложенных на него обязанностей при осуществленииавтоматизированных и связанных с ними неавтоматизированных функций системы, атакже функций по представлению информации.
Организационная структураИС «ШК» должна позволять выполнять все функции с учетом их распределения поуровням управления.
Инструкцииорганизационного обеспечения ИС «ШК» должны определять действия, необходимыедля выполнения каждой автоматизированной функции или функции по представлениюинформации, во всех режимах функционирования ИС «ШК», с учетом заданныхтребований по безошибочности и быстродействию реализации персоналом своихфункциональных обязанностей, а также содержать конкретные указания о действияхв случае возникновения аварийных ситуаций или нарушения нормальных условийфункционирования ИС «ШК».

1.4.5 Состав и содержаниеработ по созданию системы
Состав и содержание работпо созданию системы представлены в приложении 1.
1.4.6 Порядок контроля иприемки системы
1.4.6.1 Предварительныеиспытания системы
Предварительные испытаниясистемы проводят для определения ее работоспособности и решения вопроса овозможности приемки ИС «ШК» в опытную эксплуатацию.
Предварительные испытаниясистемы организует заказчик и проводит разработчик и заказчик совместно.Содержание программы испытаний должно соответствовать ГОСТу 24.208-80.
В «Протоколе испытаний»,составленном по результатам предварительных испытаний системы, приводятзаключение о возможности приемки системы в опытную эксплуатацию, а такжеперечень необходимых доработок.
1.4.6.2 Опытнаяэксплуатация
Результаты приемки ИС«ШК» в опытную эксплуатацию оформляют «Актом приемки в опытную эксплуатацию»,составленным на основании «Протокола испытаний» комиссией, проводившейпредварительные испытания системы.
Продолжительность опытнойэксплуатации системы определяют по срокам, необходимым для проверкиправильности функционирования системы при выполнении каждой автоматизированнойфункции, функции по представлению информации и готовности персонала к участию ввыполнении всех автоматизированных функций и функций по представлению информацииИС «ШК».
Во время опытнойэксплуатации системы ведется рабочий журнал, в который заносятся сведения: опродолжительности функционирования системы, о результатах наблюдения заправильностью функционирования системы, об отказах, сбоях, аварийных ситуациях,проводимых корректировках технической документации.
По результатам опытнойэксплуатации системы составляют акт о завершении работ по проверке системы врежиме опытной эксплуатации.
1.4.6.3 Приемочныеиспытания системы
Приемочные испытаниясистемы проводят для определения ее соответствия техническому заданию,требованиям стандарта и определения возможности ввода ИС «ШК» в действие.
Приемочной комиссиизаказчик и разработчик предъявляют следующую документацию:
-          техническоезадание на систему;
-          проект программыприемочных испытаний;
-          протоколпредварительных испытаний;
-          акт приемкисистемы в опытную эксплуатацию;
-          рабочие журналыопытной эксплуатации системы;
-          акт о завершенииработ по проверке системы в режиме опытной эксплуатации;
-          техническаядокументация на систему.
По результатам приемочныхиспытаний приемочная комиссия составляет протокол испытаний и акт о вводесистемы в действие.
1.4.7 Требования ксоставу и содержанию работ по подготовке объекта информатизации к вводу системыв действие
Одновременно сразработкой системы должно быть обеспечено проведение следующих мероприятий:
-          определитьконкретных лиц, ответственных от СП «ШК» ГОУ ВПО «СибГИУ» за подготовку системык эксплуатации;
-          обозначить местаустановки технических средств и обеспечить их сохранность;
-          организоватьподготовку персонала для работы с системой.
1.4.8 Требования кдокументированию
Эксплуатационнаядокументация на разрабатываемую систему должна быть достаточной для вводакомплекса в действие эффективной работы при его эксплуатации.
Документация должнасодержать сведения, необходимые для быстрого и качественного освоения иправильной эксплуатации средств автоматизации и представления информациисистемы, содержать указания по действиям персонала в аварийных ситуациях илипри нарушениях нормальных условий функционирования комплекса, не содержатьсведений, допускающих неоднозначное толкование.
Комплект документации посистеме приведен в приложении 2.
1.4.9 Заключение
В ходе разработки ИС «ШК»было установлено, что в комплекте с ЭШД было поставлено неработоспособноепрограммное обеспечение. Но так как необходимо было в срочном порядке закончитьработы по созданию системы, а на выяснение причин и дополнительную поставкуушло бы значительное время вследствие того, что оборудование поставлялось изНидерландов, было принято решение в срочном порядке пригласить специалистов изинформационного шахматного центра российской шахматной федерации, владеющихсобственным программным обеспечением для ЭШД, на время проведения соревнований,что повлекло за собой большие расходы.
После разработки ИС «ШК»,ее приемки и проведения опытной эксплуатации руководством ГОУ ВПО «СибГИУ» втесном сотрудничестве с администрацией г. Новокузнецка и администрациейКемеровской области было принято решение перенести ИС «ШК» в помещениекультурного центра «Западносибирского металлургического комбината» («ЗСМК») навремя проведения Всемирной шахматной универсиады, которая проходила в г.Новокузнецке с 3 марта по 11 марта 2008 года. Перенесение ИС «ШК» в помещениекультурного центра «ЗСМК» не составило больших трудностей, так как все блокисистемы легко отсоединяемы и транспортируемы.
Вследствие тогообстоятельства, что работоспособное программное обеспечения для ЭШД так и небыло поставлено, а специалисты из информационного шахматного центра отказалисьот коммерческой продажи СПО, являющегося их интеллектуальной собственностью,было принято решение о самостоятельной разработке подобного СПО. Данноенаправление является приоритетным для написания дипломной работы студентомШиряевым А.С.

2. Специальная часть
2.1Выбор основных методологий разработки программного обеспечения
Проект – это уникальныйпроцесс, в ходе выполнения которого получают уникальный продукт. Таким образом,для разработки продукта в проекте, скорее всего, должен применяться уникальныйпроцесс. Вместо создания каждого проекта «с нуля», руководитель проекта можетвоспользоваться обобщенной, проверенной на практике методикой, адаптировав еедля конкретного проекта. Как правило, всегда есть возможность выбора срединескольких «начальных» жизненных циклов.
Выбори адаптация жизненного цикла разработки проекта оказывает влияние на методикиразработки продукта, навыки менеджмента проектов и навыки менеджментаперсонала. Что касается методов разработки продукта, руководитель проектадолжен, прежде всего, иметь представление о стандартах процесса, уметь оценитьих применимость по отношению к данному проекту, оценить альтернативные процессыи при необходимости адаптировать процесс жизненного цикла к текущим потребностям.На выбор методов и инструментальных средств также может оказывать влияние выборжизненного цикла.
Модель жизненного цикларазработки программного обеспечения (ПО) является единственным видом процесса,в котором представлен порядок его осуществления. Модель жизненного цикларазработки ПО (SoftwareLife Cycle Model, SLCM)схематически объясняет, каким образом будут выполняться действия по разработкепрограммного продукта, посредством описания «последовательности» этих действий.Такая последовательность может быть или не быть линейной, поскольку фазы могутследовать друг за другом, повторяться или происходить одновременно. На рисунке5 представлена простая обобщенная схема процесса. /> /> /> /> /> /> /> /> /> /> /> /> /> /> />
Жизненный цикл   />
Процесс   /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> />

Рисунок5 – Обобщенная схема процесса
Модель SLCM – это схема (или основа),используемая разработчиком ПО для определения повторяющегося процесса присоздании программного продукта. Она определяет точные инструкции, которыеразработчик может использовать для создания только высококачественныхпрограммных систем. Понятие жизненного цикла ПО относится ко всем программнымпроектам, причем независимо от их размеров. />/>
Жизненный цикл – этосвоего рода «карта-путеводитель» для всех участников проекта, которая помогаетим понять, не выходят ли они за определенные для них границы. Для управленияпрограммным проектом возникает необходимость в некотором роде карты дляпланирования действий и хронологий их выполнения. />/>
В стандарт были включеныописания причин, объясняющих необходимость выполнения стандартизированногопроцесса. Этот стандарт помогает достичь следующих целей.
·         Улучшение иобеспечение качества:
-           спомощью стандартизированной процедуры можно наилучшим образом гарантироватьзавершенность результатов, которые необходимо предоставить;
-           определениепромежуточных результатов обеспечивает возможность ускорить выполнениеоценочных процедур;
-           контекстоднородных продуктов облегчает их восприятие, а также работу с процедурамиоценки.
·         Возможностьпроверки затрат на выполнение полного жизненного цикла:
-           упрощает процесссоздания стандартов разработки для определенного проекта и его оценка;
-           стандартизированныепроцедуры повышают степень «прозрачности» операций по определению затрат ипозволяют более эффективно распознавать возможные риски, связанные с затратами;
-           одинаковыестандарты уменьшают риск возникновения разногласий между клиентом иразработчиком, а также между главным разработчиком и субподрядчиком;
-           в случаеприменения стандартизированной процедуры становятся «прозрачными» универсальныеподходы к методам решения, а следовательно, их можно использовать повторно;
-           нежелательный ходпроцесса разработки, возможно, выявить на ранней стадии;
-           уменьшаютсязатраты на подготовку персонала.
·         Улучшается обменинформацией между различными сторонами, участвующими в процессе разработки;происходит снижение зависимости клиента от подрядчика:
-           использованиеопределенных терминов уменьшает разногласия, возникающие между всемизадействованными в проекте сторонами;
-           пользователь,покупатель и разработчик получают поддержку при формулировании своихтребований, а также при описании своих ролей или полученных результатов;
-           промежуточные и окончательныерезультаты стандартизируются таким образом, что другие задействованные впроекте стороны или персонал других компаний могут в случае необходимостиподключиться к процессу разработки, не прилагая при этом больших дополнительныхусилий.
«Каркасом»процесса разработки ПО служит модель зрелости функциональных возможностей (Capability Maturity Model, CMM).Она основана на практических действиях, отображает лучшие результаты иопределяет потребности индивидов, работающих над усовершенствованием процессаразработки ПО и выполняющих оценочный анализ этого процесса. Модель СММпредставляет собой схему, по которой этапы разработки соответствуют пятиуровням развития функциональных возможностей, на основе которых осуществляетсянепрерывное усовершенствование процесса разработки.
Исходный. Процесс разработки ПО можноохарактеризовать как специальный, подобранный для определенного случая процесс,а иногда и как хаотический. Определить можно лишь небольшое количествопроцессов, и успех зависит от приложенных усилий и предпринимаемых решительныхдействий.
Повторяющийся. Основные процессы управленияпроектом создаются для того, чтобы отслеживать затраты, график работы ифункциональные возможности. Здесь соблюдается необходимый порядок выполненияпроцесса, предназначенный для повторения достижений, полученных ранее привыполнении подобных проектов.
Определенный.Во всех проектахиспользуется испытанная, адаптированная версия стандартного процесса разработкиПО данной организации.
Управляемый. Собираются детальные показателипроцесса разработки ПО и качественные характеристики продукта. Управлениепроцессом разработки программных продуктов осуществляется на количественномуровне.
Уровеньоптимизации. Непрерывноеусовершенствование процесса разработки достигается с помощью количественнойобратной связи, достигаемой при осуществлении самого процесса, а также на базеноваторских идей и технологий.
Определениепроцесса включает в себя разработку и сопровождение стандартного процессаразработки определенной организации, а также относящиеся к нему ценные свойствапроцесса, такие как описательные характеристики жизненных циклов разработки ПО,руководящие принципы адаптации процесса и его критерии.
Цельопределения организационной структуры процесса заключается в разработке исопровождении стандартного процесса разработки ПО для данной организации.
Действия,формулирующие процесс построения организационной структуры, включаютдокументирование и сопровождение описательных характеристик жизненных цикловразработки ПО, которые одобрены для использования в проектах. Руководящиепринципы и критерии адаптации описывают выбор и адаптацию жизненного цикларазработки ПО и характеристик данного проекта.
Наиболееизвестными и широко используемыми жизненными циклами разработки ПО можно назватьследующие: каскадная модель и экстремальная модель. Есть и ряд другихметодологий, но в ходе реализации данного дипломного проекта они неисследовались. Рассмотрим указанные модели подробнее.
2.1.1 Каскаднаяметодология
Классическая каскадная модель, несмотря на полученную впоследнее время негативную оценку, исправно служила специалистам попрограммному инжинирингу многие годы. Понимание ее сильных сторон и недостатковулучшает оценочный анализ других, зачастую более эффективных моделей жизненногоцикла, основанных на данной модели.
В первые годы практики программирования сначала записывалсяпрограммный код, а затем происходила его отладка. Общепринятым считалосьправило начинать работу не с разработки плана, а с общего ознакомления спродуктом. Без лишних формальностей можно было спроектировать, закодировать,отладить и протестировать ПО еще до того, как оно будет готово к выпуску. Этонапоминало процесс, изображенный на рисунке 6./> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> /> />

/>

Рисунок 6 – Модель процесса «делать, пока, не будетсделано”

В структуре такого процесса есть несколько»неправильностей" (или недостатков). Во-первых, поскольку изначальноне существовало официального проекта или анализа, невозможно было узнать омоменте завершения процесса. Также отсутствовал способ определения соответствиятребованиям относительно достижения качества.
В 1970 году каскадная модель была впервые определена какальтернативный вариант метода разработки ПО по принципу кодирование-устранениеошибок, который был широко распространен в то время. Это была первая модель,которая формализовала структуру этапов разработки ПО, придавая особое значениеисходным требованиям и проектированию, а также созданию документации на раннихэтапах процесса разработки.
Начальный этапвыполнения каскадной модели показан в левой верхней части рисунка 7.Продолжение процесса выполнения реализуется с помощью упорядоченнойпоследовательности шагов. В модели предусмотрено, что каждая последующая фазаначинается лишь тогда, когда полностью завершено выполнение предыдущей фазы.Каждая фаза имеет определенные критерии входа и выхода: входные и выходныеданные.
/>
Рисунок 7 – Классическаякаскадная модель с обратной связью
В результатевыполнения генерируются внутренние или внешние данные проекта, включайдокументацию и ПО. Документы по анализу требований впоследствии передаютсясистемным специалистам, которые в свою очередь передают их разработчикампрограммных систем более высокого уровня. Программисты передают детальныетехнические характеристики программистам, которые уже представляют готовый кодтестерам.
Переход от одной фазы к другой осуществляется посредствомформального обзора. Таким образом, клиент получает общее представление опроцессе разработки, кроме того происходит проверка качества программногопродукта. Как правило, прохождение стадии обзора указывает на договоренностьмежду командой разработчиков и клиентом о том, что текущая фаза завершена иможно перейти к выполнению следующей фазы. Окончание фазы удобно принимать застадию в процессе выполнения проекта.
В результате завершения определенных фаз формируется базоваялиния, которая в данной точке «замораживает» продукты разработки.Если возникает потребность в их изменении, тогда для внесения измененийиспользуется формальный процесс изменений.
В критических точках каскадной модели формируются базовыелинии, последняя из которых является базовой линией продукта. После формированиязаключительной базовой линии производится обзор приемки.
Попытки оптимизации каскадной модели привели к возникновениюдругих циклов разработки ПО. Прототипирование программ позволяет обеспечитьполное понимание требований, в то время как инкрементные и спиральные моделипозволяют повторно возвращаться к фазам, соотнесенным с классической каскадноймоделью, прежде чем полученный продукт будет признан окончательным.
Отличительнымсвойством каскадной модели можно назвать то, что она представляет собой формальныйметод, разновидность разработки «сверху вниз», она состоит изнезависимых фаз, выполняемых последовательно, и подвержена частому обзору./>а) Краткое описание фаз каскадной модели
Приведенная ниже характеристикапредставляет собой краткое описание каждой фазы каскадной модели (включая фазыинтеграции):
·         исследованиеконцепции — происходитисследование требований на системном уровне с целью определения возможностиреализации концепции;
·         процесс системногораспределения — можетбыть пропущен для систем по разработке исключительно ПО. Для систем, в которыхнеобходима разработка как аппаратного, так и программного обеспечения,требуемые функции применяются к ПО и оборудованию в соответствии с общей архитектуройсистемы;
·         процессопределения требований —определяются программные требования для информационной предметной областисистемы, предназначение, линии поведения, производительность и интерфейсы. (Вслучае необходимости в процесс также включено функциональное распределениесистемных требований к аппаратному и программному обеспечению.);
·         процессразработки проекта—разрабатывается и формулируется логически последовательная техническаяхарактеристика программной системы, включая структуры данных, архитектуру ПО,интерфейсные представления и процессуальную (алгоритмическую) детализацию;
·         процессреализации — врезультате его выполнения эскизное описание ПО превращается в полноценныйпрограммный продукт. При этом создается исходный код, база данных и документация,которые лежат в основе физического преобразования проекта. Если программныйпродукт представляет собой приобретенный пакет прикладных программ, основнымидействиями по его реализации будут являться установка и тестирование пакетапрограмм. Если программный продукт разрабатывается на заказ, основнымидействиями являются программирование и код-тестирование;
·         процесс установки — включает установку ПО, егопроверку и официальную приемку заказчиком для операционной среды;
·         процессэксплуатации и поддержки- подразумевает запуск пользователем системы и текущее обеспечение, включаяпредоставление технической помощи, обсуждение возникших вопросов спользователем, регистрацию запросов пользователя на модернизацию и внесениеизменений, а также корректирование или устранение ошибок;
·         процесссопровождения— связан сразрешением программных ошибок, неисправностей, сбоев, модернизацией ивнесением изменений, генерируемых процессом поддержки. Состоит из итерацийразработки и предполагает обратную связь по предоставлению информации обаномалиях;
·         процесс вывода изэксплуатации — выводсуществующей системы из ее активного использования либо путем прекращения ееработы, либо благодаря ее замене новой системой или модернизированной версиейсуществующей системы;
·         интегральныезадачи — включают началоработы над проектом, мониторинг проекта и его управление, управление качеством,верификацию и аттестацию, менеджмент конфигурации, разработку документации ипрофессиональную подготовку на протяжении всего жизненного цикла./>б) Преимущества каскадной модели
Нетрудно заметить, что каскадная модель имеет множествопреимуществ, если ее использовать в проекте, для которого она достаточноприемлема. Ниже перечислены эти преимущества:
·         модель хорошоизвестна потребителям, не имеющим отношения к разработке и эксплуатациипрограмм, и конечным пользователям (она часто используется другимиорганизациями для отслеживания проектов, не связанных с разработкой ПО);
·         она упорядоченеесправляется со сложностями и хорошо срабатывает для тех проектов, которыедостаточно понятны, но все же трудно разрешимы;
·         она весьмадоступна для понимания, так как преследуется простая цель — выполнитьнеобходимые действия;
·         она проста иудобна в применении, так как процесс разработки выполняется поэтапно;
·         ее структуройможет руководствоваться даже слабо подготовленный в техническом плане илинеопытный персонал;
·         она отличаетсястабильностью требований;
·         она представляетсобой шаблон, в который можно поместить методы для выполнения анализа,проектирования, кодирования, тестирования и обеспечения;
·         она хорошосрабатывает тогда, когда требования к качеству доминируют над требованиями кзатратам и графику выполнения проекта;
·         она способствуетосуществлению строгого контроля менеджмента проекта;
·         при правильномиспользовании модели дефекты можно обнаружить на более ранних этапах, когда ихустранение еще не требует относительно больших затрат;
·         она облегчаетработу руководителю проекта по составлению плана и Комплектации командыразработчиков;
·         она позволяетучастникам проекта, завершившим действия на выполняемой ими фазе, принятьучастие в реализации других проектов;
·         она определяетпроцедуры по контролю за качеством. Каждые полученные данные подвергаютсяобзору. Такая процедура используется командой разработчиков для определениякачества системы;
·         стадии моделидовольно хорошо определены и понятны;
·         ход выполненияпроекта легко проследить с помощью использования временной шкалы (или диаграммыГанта), поскольку момент завершения каждой фазы используется в качестве стадии./>в) Недостатки каскадной модели
Нопри использовании каскадной модели для проекта, который трудно назватьподходящим для нее, проявляются следующими недостатки:
·         в основе моделилежит последовательная линейная структура, в результате чего каждая попыткавернуться на одну или две фазы назад, чтобы исправить какую-либо проблему илинедостаток, приведет к значительному увеличению затрат и сбою в графике;
·         она не можетпредотвратить возникновение итераций между фазами, которые так частовстречаются при разработке ПО, поскольку сама модель создается согласностандартному циклу аппаратного инжиниринга;
·         она не отображаетосновное свойство разработки ПО, направленное на разрешение задач. Отдельныефазы строго связаны с определенными действиями, что отличается от реальнойработы персонала или коллективов;
·         она может создатьошибочное впечатление о работе над проектом. Выражение типа «35 процентов выполнено»— не несет никакого смысла и не является показателем для руководительа проекта;
·         интеграция всехполученных результатов происходит внезапно в завершающей стадии работы модели.В результате такого единичного прохода через весь процесс, связанные синтегрированием проблемы, как правило, дают о себе знать слишком поздно.Следовательно, проявятся не обнаруженные ранее ошибки или конструктивныенедостатки, повысить степень риска при небольшом задаче времени навосстановление продукта;
·         у клиента едва лиесть возможность ознакомиться с системой заранее, это происходит лишь в самомконце жизненного цикла. Клиент не имеет возможности воспользоваться доступнымипромежуточными результатами, и отзывы пользователей нельзя передать обратноразработчикам. Поскольку готовый продукт не доступен вплоть до окончанияпроцесса, пользователь принимает участие в процессе разработки только в самомначале — при сборе требований, и в конце — во время приемочных испытаний;
·         пользователи немогут убедиться в качестве разработанного продукта до окончания всего процессаразработки. Они не имеют возможности оценить качество, если нельзя увидетьготовый продукт разработки;
·         у пользователянет возможности постепенно привыкнуть к системе. Процесс обучения происходит вконце жизненного цикла, когда ПО уже запущено в эксплуатацию;
·         проект можновыполнить, применив упорядоченную каскадную модель, и привести его всоответствие с письменными требованиями, что, однако, не гарантирует егозапуска в эксплуатацию;
·         каждая фазаявляется предпосылкой для выполнения последующих действий, что превращает такойметод в рискованный выбор для систем, не имеющих аналогов, так как он неподдается гибкому моделированию;
·         для каждой фазысоздаются результативные данные, которые по его завершению считаютсязамороженными. Это означает, что они не должны изменяться на следующих этапахжизненного цикла продукта. Если элемент результативных данных какого-либо этапаизменяется (что встречается весьма часто), на проект окажет негативное влияниеизменение графика, поскольку ни модель, ни план не были рассчитаны на внесениеи разрешение изменения на более поздних этапах жизненного цикла;
·         все требованиядолжны быть известны в начале жизненного цикла, но клиенты редко могутсформулировать все четко заданные требования на этот момент разработки. Модельне рассчитана на динамические изменения в требованиях на протяжении всегожизненного цикла, так как получаемые данные «замораживаются».Использование модели может повлечь за собой значительные затраты, если требованияв недостаточной мере известны или подвержены динамическим изменениям во времяпротекания жизненного цикла;
·         возникаетнеобходимость в жестком управлении и контроле, поскольку в модели непредусмотрена возможность модификации требований;
·         модель основанана документации, а значит, количество документов может быть избыточным;
·         весь программныйпродукт разрабатывается за один раз. Нет возможности разбить систему на части.В результате взятых разработчиками обязательств разработать целую систему за одинраз могут возникнуть проблемы с финансированием проекта. Происходитраспределение больших денежных средств, а сама модель едва ли позволяетповторно распределить средства, не разрушив при этом проект в процессе еговыполнения;
·         отсутствуетвозможность учесть переделку и итерации за рамками проекта./>г) Область применения каскадной модели
Из-за недостатков каскадной модели ее применение необходимоограничить ситуациями, в которых требования и их реализация максимально четкоопределены и понятны.
Каскадная модель хорошо функционирует при ее применении вциклах разработки программного продукта, в которых используется неизменяемоеопределение продукта и вполне понятные технические методики.
Если компания имеетопыт построения определенного рода системы — автоматизированного бухгалтерскогоучета, начисления зарплаты, ревизии, компиляции, производства, — тогда впроекте, ориентированном на построение еще одного продукта такого же типа,возможно, даже основанного на существующих разработках, можно эффективноиспользовать каскадную модель. Другим примером надлежащего применения моделиможет служить создание и выпуск новой версии уже существующего продукта, есливносимые изменения вполне определены и управляемы. Перенос уже существующегопродукта на новую платформу часто приводят в качестве идеального примераиспользования каскадной модели в проекте.
При всей справедливостикритики этой модели все же следует признать, что модифицированная версиякаскадной модели является в значительной степени менее жесткой, чем еепервоначальная форма. Здесь включаются итерации между фазами, параллельные фазыи менеджмент изменений. Обратные стрелки предполагают возможность существованияитераций между действиями в рамках фаз. Чтобы отобразить согласованность междуэтапами, их объединяют прямоугольниками или под прямоугольниками перечисляютвыполняемые на данных этапах действия, чтобы продемонстрировать согласованностьмежду ними. Несмотря на то, что модифицированная каскадная модель являетсязначительно более гибкой, чем классическая модель, она все же не являетсянаилучшим выбором для выполнения проектов по ускоренной разработке.
Каскадные модели на протяжении всего времени их существованияиспользуются при выполнении больших проектов, в которых задействовано несколькобольших команд разработчиков.
2.1.2 Экстремальнаяметодология
Отцом-идеологомэкстремального программирования (XP)считают Кента Бека (Kent Beck). XP является достаточно молодой методологией,оценки которой весьма противоречивы — от восторженных до резко негативных.Основными принципами являются:
-   Простота решений(simplicity).
-   Интенсивнаяразработка малыми группами (не больше 10 человек), активное общение в группе имежду группами (communication).
-   Обратная связь склиентом (feedback), который фактически вовлечен в процесс разработки.
-   Достаточнаястепень смелости (courage) и желание идти на риск.
Первый факторускорения разработки — итеративность: разработка ведется короткими итерациямипри наличии активной взаимосвязи с заказчиком. XP — это итеративный процессразработки, который сам по себе не является революционным. Итерации как таковыепредлагается делать короткими, рекомендуемая длительность — 2-3 недели и неболее 1 месяца. За одну итерацию группа программистов обязана реализоватьнесколько свойств системы, каждое из которых описывается в пользовательскойистории (user story). Пользовательские истории в данном случае являютсяначальной информацией, на основании которой создается модуль. Пользовательскиеистории отличаются от прецедентов (use case): пользовательская история коротка —1-2 абзаца, тогда как прецеденты обычно пишут достаточно подробными, с основными альтернативными потоками — таким образом, получается примерно страница плюссхема (наиболее распространенная формализация в настоящее время предложена вUML); истории пользователей пишутся самими пользователями (которые в XPявляются частью команды) в отличие от прецедентов, которые обычно пишетсистемный аналитик. Отсутствие формализации описания входных данных проекта вXP стремятся компенсировать посредством активного включения в процессразработки заказчика как полноправного члена команды и за счет наличияпостоянного контакта с заказчиком (активное общение и непрерывная поддержкаобратной связи). В данном случае extreme — это степень привлечения заказчика кпрограммистской кухне, что обусловлено стремлением сжать сроки разработки засчет коммуникации и обратной связи.
Второй факторускорения разработки продукта — наличие малых групп и парное программирование(когда два программиста вместе создают код на одном общем рабочем месте). Всеэто нацелено на достижение высокого уровня общения в группе, а также на какможно более раннее обнаружение проблем (как ошибок, так и срыва сроков). Парноепрограммирование преследует цель стабилизации проекта, так как при даннойметодологии высок риск потери кода по причине ухода программиста, невыдержавшего интенсивного графика работы. В этом случае второй программист изпары играет роль «наследника» кода (что в классических методиках реализуется втехнической документации). Немаловажно и то, как именно распределены группы врабочем пространстве — в XP используется открытое рабочее пространство, котороепредполагает быстрый и свободный доступ всех ко всем; как правило, рабочеепространство строится на основе круга.
Третий факторускорения разработки процесса — принятие первого наипростейшего рабочегорешения. В данном случае экстремальность метода связана с высокой степеньюриска решения, обусловленного поверхностностью анализа и жестким временнымграфиком. Реализуется минимальный набор главных функций системы на первой икаждой последующей итерации; функциональность расширяется на каждой итерации./>а) Практикиэкстремальной методологии
Обычно XPхарактеризуют набором из 12 действий (практик), которые необходимо выполнятьдля достижения хорошего результата. Практики XP не определяют сам процесс XP,но XP определяет эти практики — то есть выполнение практик не гарантируетрезультата. Ни одна из практик не является принципиально новой, но в XP онисобраны вместе.
-     Планированиепроцесса (planning game). Вся команда собирается вместе, принимаетсяколлективное решение о том, какие свойства системы будут реализованы вближайшей итерации. Набор свойств определяется пользовательскими историями.XP-трудоемкость каждого свойства определяется самими программистами.
-     Тесноевзаимодействие с заказчиком (feed-back, on-site customer). Заказчик должен бытьчленом XP-команды (on-site customer). Он пишет пользовательские истории,выбирает истории, которые будут реализованы в конкретной итерации, и отвечаетна вопросы, касающиеся бизнеса. Заказчик должен быть экспертом вавтоматизируемой предметной области. Необходимо постоянное наличие обратнойсвязи с заказчиком (feed-back).
-     Метафора системы(system metaphor). Хорошая метафора системы означает простоту именованияклассов и переменных. В реальной жизни поиск метафоры — крайне сложное занятие;найти хорошую метафору непросто. В любом случае команда должна иметь единыеправила именования.
-     Простаяархитектура (simple design). Любое свойство системы должно быть реализовано какможно проще. Программисты в XP-команде работают под девизом: «Ничего лишнего!».Принимается первое наипростейшее работающее решение, реализуется необходимыйуровень функциональности на данный момент. Тем самым экономится времяпрограммиста.
-     Стандартыкодирования (coding conventions). Стандарты кодирования нужны для обеспечениядругих практик: коллективного владения кодом, парного программирования ирефакторинга. Без единого стандарта выполнять эти практики как минимум сложнее,а в реальности вообще невозможно: группа будет работать в режиме постояннойнехватки времени. Детальные стандарты не требуются, необходимостандартизировать только важные вещи. Определение наиболее важных объектовстандартизации в XP субъективно.
-     Рефакторинг(refactoring). Рефакторинг — это оптимизация существующего кода в сторонуупрощения, что предусматривает постоянную работу по упрощению кода. Сохраняякод прозрачным и определяя его элементы всего один раз, программисты сокращаютчисло ошибок, которые впоследствии придется устранять. При реализации каждогонового свойства системы программист должен подумать над тем, можно ли упроститьсуществующий код и как это поможет реализовать новое свойство. Кроме того,нельзя совмещать рефакторинг с дизайном: если создается новый код, рефакторингнадо отложить.
-     Парноепрограммирование (pair programming) — одна из самых известных XP-практик. Всепрограммисты должны работать в парах: один пишет код, другой смотрит. Такимобразом, необходимо размещать группу программистов в одном месте, что легчевсего сделать на территории заказчика (все необходимые члены командыгеографически находятся в одном месте); XP наиболее успешно работает внераспределенных коллективах программистов и пользователей.
-     40-часоваярабочая неделя. Программист не должен работать более 8 часов в день.Необходимость сверхурочной работы (overtime) — это четкий индикатор проблемы наданном конкретном направлении разработки; к тому же заказчик не платит засверхурочную работу в XP. Поиск причин сверхурочной работы и их скорейшееустранение — одно из основных правил.
-     Коллективноевладение кодом (collective code ownership). Каждый программист в коллективе XPдолжен иметь доступ к коду любой части системы и вносить изменения в любой код.Обязательное правило: если программист внес изменения и система после этогоработает некорректно, то именно этот программист должен исправить ошибки. Впротивном случае работа системы уподобится тотальному хаосу.
-     Частая сменаверсий (small releases). Минимальная итерация — один день, максимальная —месяц; чем чаще осуществляются релизы, тем больше недостатков системы будетвыявлено. Первые релизы помогают выявить недостатки на самых ранних стадиях,далее функциональность системы расширяется (на основании тех жепользовательских историй). Поскольку пользователь включается в процессразработки начиная с первого релиза, то он оценивает систему и выдаетпользовательскую историю плюс feedback. На основании этого определяетсяследующая итерация: каким будет новый релиз. В XP все направлено на обеспечениенепрерывной обратной связи с пользователями.
-     Непрерывнаяинтеграция (continuous integration). Интеграция новых частей системы должнапроисходить как можно чаще, как минимум раз в несколько часов. Основное правилоинтеграции следующее: интеграцию можно производить, если все тесты проходятуспешно. Если тесты не проходят, то программист должен либо внести исправленияи тогда интегрировать составные части системы, либо вообще не интегрировать их.Правило это жесткое и однозначное — если в созданной части системы имеется хотябы одна ошибка, то интеграцию производить нельзя. Частая интеграция позволяетбыстрее получить готовую систему, вместо того чтобы тратить на сборку неделю.
-     Тестирование(testing). В отличие от большинства остальных методологий тестирование в XP —одно из важнейших составляющих. Экстремальный подход заключается в том, чтотесты пишутся до написания кода. Каждый модуль обязан иметь unit test — тест данногомодуля; таким образом, в XP осуществляется regression testing (возвратноетестирование, «неухудшение качества» при добавлении функциональности).Большинство ошибок исправляются на стадии кодирования. Тесты пишут самипрограммисты; любой программист имеет право написать тест для любого модуля.Еще один важный принцип: тест определяет код, а не наоборот (такой подход носитназвание test-driven development), то есть кусок кода кладется в хранилищетогда и только тогда, когда все тесты прошли успешно, в противном случае данноеизменение кода отвергается.
Итак, XPкрайне пренебрежительно относится ко всем артефактам процесса разработки, кромеисходного кода. Процесс XP является в высшей степени неформальным, но требуетвысокого уровня самодисциплины. Если это правило не выполняется, то XPмгновенно превращается в хаотичный и неконтролируемый процесс. XP не требует отпрограммистов написания множества отчетов и построения массы моделей. В XPкаждый программист считается квалифицированным работником, который профессиональнои с большой ответственностью относится к своим обязанностям. Если в командеэтого нет, то внедрять XP абсолютно бессмысленно — лучше для начала занятьсяперестройкой команды. Риск разработки снижается только в команде, которой XPподходит идеально, во всех остальных случаях XP — это процесс разработки снаиболее высокой степенью риска, поскольку другие методы снижения коммерческихрисков, кроме банального человеческого фактора, в XP просто отсутствуют.
б) Существующиериски применения методологии
Следуетвыделить риски XP, способные завалить проект, если не учитывать и непредотвращать их.
-     Этап планирования(planning game). Программисты реализуют только те функции, которые необходимыдля возможностей, выбранных на данной итерации заказчиком. В результате такогорешения за кадром остается развитие системы, вследствие чего при разработкевозникает необходимость строить «заглушки» и переписывать код.
-     Постоянноеучастие заказчика (on-site customer). Представитель заказчика в период работынад системой находится в команде разработчиков, причем требования кквалификации этого человека или команды весьма высоки. Если заказчик несогласился предоставить персонал уровня экспертов, то проект попадает в группунаиболее высокого риска.
-     Метафора (metaphor).Общий вид системы определяется при помощи метафоры или набора метафор, надкоторыми совместно работают заказчик и программисты. Если не ведется журналданного процесса и структура наименований не стандартизована, то такой процессможет оказаться бесконечно итерационным.
-     Простаяархитектура (simple design). В каждый момент времени разрабатываемая системавыполняет все тесты и поддерживает все взаимосвязи, определяемые программистом,не имеет дубликатов кода и содержит минимально возможное количество классов иметодов. Это правило кратко можно выразить так: «Каждую мысль формулируй один итолько один раз». Данный принцип вступает в противоречие с быстротой написаниякода. Без наличия высокой самодисциплины и жестких стандартов кода системанемедленно попадает в группу риска.
-     Частая сменаверсий (small releases). Систему запускают в эксплуатацию уже через несколькомесяцев после начала реализации, не дожидаясь окончательного разрешения всехпоставленных проблем. Периодичность выпуска новых версий может варьироваться отежедневной до ежемесячной. Протестировать за такой срок более-менее сложныйкомпонент невозможно; заказчик фактически выступает в роли бета-тестера.Системы, к которым предъявляется требование непрерывной надежной работы (такназываемое требование 24Ѕ7), входят в группу риска.
-     Переработкасистемы (refactoring). Архитектура системы постоянно эволюционирует. Текущийпроект трансформируется, при этом гарантируется правильное выполнение всехтестов. Экстремальное программирование исходит из того, что переделать частьсистемы всегда можно, причем без особых затрат. Однако практика довольно частосвидетельствует об обратном.
-     Непрерывнаяинтеграция (continuous integration). Новый код интегрируется в существующуюсистему не позднее чем через несколько часов. После этого система вновьсобирается в единое целое и прогоняются все тесты. Если хотя бы один из них невыполняется корректно, внесенные изменения отменяются. В данном случае невсегда понятно, кто именно будет исправлять ошибки, причем не только локальные,но и наведенные неправильным кодом. Проведение комплексных тестов на данномэтапе не предполагается; кроме того, изменения сохраняются даже в том случае,когда ошибка обнаружена.
-     Программированиев паре (pair programming). Весь код проекта пишут группы по два человека,использующих одно рабочее место. Человеческий фактор в данном случае играетопределяющую роль: пара или работает или нет, третьего не дано.
-     40-часовая неделя(40-hour weeks). Объем сверхурочных работ не может превышать по длительностиодну рабочую неделю. Даже отдельные случаи сверхурочных работ, повторяющиесяслишком часто, служат признаком серьезных проблем, которые требуютбезотлагательного решения. Как показывает практика применения экстремальногопрограммирования (несмотря на целый ряд положительных примеров, приводимыхсторонниками данного метода), сверхурочная работа при таком подходе — этоправило, а не исключение, и борьба с проблемами в данном случае — явлениепостоянное. Усиливается она в период замены текущей сырой версии продуктаочередной — менее сырой. Если заказчик не получает постоянных доказательствулучшения системы, значит, у вас возникли серьезные проблемы.
-     Коллективноевладение (collective ownership). Каждый программист имеет возможность принеобходимости в любое время усовершенствовать любую часть кода в системе. Безстандарта контроля исходного кода процесс разработки приобретает абсолютнонеконтролируемый характер.
-     Открытое рабочеепространство (open workspace). Команда разработчиков располагается в большомпомещении, окруженном комнатами меньшей площади. В центре рабочего пространстваустанавливаются компьютеры, на которых работают пары программистов (причем всоответствии с вышеизложенными принципами, все это должно располагаться натерритории заказчика, поскольку он весьма активно привлекается к процессуразработки). При наличии территориально распределенной группы разработчиков изаказчиков проект требует стандартизации протокола взаимодействия (быстро,надежно, безотказно) или попадает в группу риска.
-     Тесты (tests).Программисты постоянно пишут тесты для модулей (unit tests). Собранные вместе,эти тесты должны работать корректно. Для этапов итерации заказчики пишутфункциональные тесты (functional tests), от которых также требуется правильнаяработа. Однако на практике это не всегда достижимо. Чтобы принять верноерешение, необходимо понять, во что обойдется сдача системы с заранее известнымдефектом, и сравнить это с ценой задержки на его устранение. Тесты, написанныесамими программистами (особенно в условиях сверхурочных работ), не являютсяполнофункциональными и уж тем более не учитывают особенностеймногопользовательской работы. На более продвинутые тесты у разработчиков обычноне хватает времени. Решается данная проблема путем привлечения на определенныйсрок контакторов, что связано с большой ролью человеческого фактора: посколькутехническая документация изначально отсутствует, то информация передаетсяпосредством общения программистов. Хотя, конечно, можно построить системуразработки таким образом, что от начала до конца всем будут заниматься одни ите же люди. К сказанному необходимо добавить, что тестирование системы вовсе неисчерпывается тестами компонентов (units); не менее важны тесты взаимодействиямежду ними, это же относится и к тестам надежности работы. И тем не менее методэкстремального программирования не предусматривает создания тестов данногокласса. Это объясняется тем, что сами подобные тесты могут представлятьдостаточно сложный код (особенно это касается тестов — имитаторов реальнойработы системы). В данной технологии также никак не учитывается еще один важныйкласс тестов — тесты поведения системы при росте объемов обрабатываемойинформации. При высокой частоте изменения версий выполнить такой тесттехнологически невозможно, поскольку его проведение требует стабильного инеизменного кода проекта, например в течение недели. В таком случае придетсяили приостанавливать разработку компонентов, или создавать на время проведениятеста параллельную версию проекта, которая будет сохраняться неизменной, тогдакак другая при этом будет изменяться. Затем нужно будет выполнить процессслияния кода. Но в этом случае тест придется создавать заново, так как методыэкстремального программирования просто не предусматривают разработку средств,позволяющих прогнозировать поведение системы при тех или иных изменениях.Решать данные проблемы в XP предлагается посредством все того же человеческогофактора и самодисциплины.
-     Не более чемправила (just rules). Члены коллектива, работающего по технологииэкстремального программирования, обязуются выполнять изложенные правила. Однакоэто не более чем правила, и команда может в любой момент изменить их, если еечлены достигнут принципиального соглашения по поводу внесенных изменений.Данный принцип серьезно зависит от человеческого фактора; нарушение дисциплиныразработки влечет за собой срывы сроков и в результате ведет к краху проекта.
В итоге мыполучаем метод, потенциально обладающий высокой адаптацией к серьезно и частоизменяющимся требованиям к проекту, но в то же время не свободный от рядапринципиальных недостатков и в очень высокой степени зависимый от человеческогофактора.
Такимобразом, результат применения метода экстремального программирования можетполучиться либо экстремально хорошим, либо экстремально плохим.
2.2 Выбор инструментальных средств
В качестве единой средыразработки, как для транслятора партий так и для регистратора была выбранасреда NetBeans IDE. NetBeans IDE — свободная интегрированная средаразработки приложений (IDE) на языке программирования Java, Ruby, C++ и рядедругих. Среда разработки NetBeans по умолчанию поддерживает разработку дляплатформ J2SE и J2EE. Для разработки программ в среде NetBeans и для успешнойинсталляции и работы самой среды NetBeans должен быть предварительно установленSun JDK или J2EE SDK подходящей версии. Для поддержки разработки в средеNetBeans для мобильных платформ (J2ME) необходимо установить отдельнораспространяемый (и также бесплатный) NetBeans Mobility Pack (доступен только дляLinux и Windows). Проект NetBeans IDE поддерживается и спонсируется фирмой SunMicrosystems, однако разработка NetBeans ведется независимо сообществомразработчиков-энтузиастов (NetBeans Community) и компанией NetBeans Org. Покачеству и возможностям последние версии NetBeans IDE не уступают лучшимкоммерческим (платным) интегрированным средам разработки для языка Java, таким,как IntelliJ IDEA, поддерживая рефакторинг, профилирование, выделениесинтаксических конструкций цветом, автодополнение набираемых конструкций налету, множество предопределённых шаблонов кода и др. В версии NetBeans IDE 6.0декларируется поддержка UML, SOA, языка программирования Ruby (включаяподдержку Ruby on Rails), а также средства для создания приложений на J2ME длямобильных телефонов (Linux, Windows). NetBeans IDE поддерживает плагины,позволяя разработчикам расширять возможности среды. На идеях, технологиях и взначительной части на исходном коде NetBeans IDE базируются предлагаемые фирмойSun коммерческие интегрированные среды разработки для Java — Sun Java StudioCreator, Sun Java Studio Enterprise и Sun Studio (для ведения разработки на C,C++ или Фортран). Сравнительно недавно Sun стала предлагать эти средыразработки бесплатно для зарегистрировавшихся в Sun Developer Network (SDN)разработчиков, сама же регистрация на сайте бесплатна и не требует никакихпредварительных условий, кроме согласия с лицензией CDDL. NetBeans IDE доступнав виде готовых дистрибутивов (прекомпилированных бинарников) для платформMicrosoft Windows, GNU/Linux, FreeBSD, Mac OS X и Solaris (как для SPARC, так идля x86 — Intel и AMD). Для всех остальных платформ доступна возможностьсобрать NetBeans самостоятельно из исходных текстов.
Корпорация SunMicrosystems добавила поддержку Ruby к своей интегрированной среде разработкиNetBeans и расширила платформу JRuby. Первая версия NetBeans Ruby Pack содержитподключаемый модуль для свободно распространяемой среды разработки NetBeans,поддерживающей Ruby и JRuby. Последний представляет собой Java-реализацию Ruby,которая работает с виртуальной машиной Java. Платформа NetBeans в первуюочередь ориентирована на Java, но может быть расширена и до Ruby. Как правило,разработчики, которые пишут программы на этом языке, не используютинтегрированные среды разработки. Однако, как подчеркнул Тор Норби, старшийинженер Sun, «предложенное корпорацией решение представляет собой значительноболее производительную среду, чем все, что существовало для Ruby ранее».
2.3 Содержательнаяпостановка задачи создания СШПО
Предметная область
Специализированное шахматное программное обеспечение (СШПО) предназначенодля переноса играющихся шахматных партий в электронную форму, трансляции игрдля присутствующей на соревнованиях аудитории и в сети Интернет. ПользователямиСШПО будет являться персонал структурного подразделения «Шахматный клуб» ГОУВПО «СибГИУ» и персонал МУДОД «СДЮСШОР по шахматам».
Дано:
ДействующаяИС «Шахматный клуб».
Прототипыинформационной системы.
Множествомоделей жизненного цикла (МЖЦ) разработки программного обеспечения.
Инструментальныесредства разработки ПО.
Общиетребования к СШПО:
–          работоспособностьво всех современных операционных системах (ОС),
–          непрерывностьработы в ходе всего соревновательного процесса,
–          возможностьполучения корректной и оперативной информации о соревнованиях за пределамитурнирного зала и из любой точки земного шара по сети Интернет,
–          накопление исохранение информации по соревновательному процессу,
–          экономия времении средств на перенос партий в электронную форму,
–          обеспечениепрохождения соревновательного процесса в рамках действующих игровых правил,
–          учет возможностиисправления неправильного течения игрового процесса.
Ограничения:
При выборе МЖЦ ограничиться каскадной и экстремальной МЖЦ разработкипрограммного обеспечения.
1. Привыборе инструментальных средств разработки СШПО ограничиться следующимипрограммными продуктами: NetBeans IDE 6.0, MySQLAdministrator.
2. Входе функционирования СШПО во время соревновательного процесса должнывыполняться следующие условия:
–          СШПО должнофункционировать без простоев в течении всего игрового дня.
–          Отображаемый ходдолжен полностью соответствовать ходу, сделанному на электронной шахматнойдоске.
–          Временнаязадержка трансляции, если она заранее не предусмотрена, не должна превышать 0,5секунды.
–          Временнаязадержка переноса игрового процесса в электронную форму не должна превышать 0,5секунды.
Требуется
Реализовать СШПО с учетом всех требований и ограничений
2.4 Разработка алгоритмарешения задачи
Регистратор шахматныхпартий (РШП) реализуется на языке Java (j2se). РШП реализует протокол обмена данных DGT шахматных электронных досок, которыйв свою очередь базируется на прокотоле обмена через последовательный порт RS-232. В качестве компонента дляработы с последовательным портом в Java была выбрана библиотека rxtxверсии 1.72. Протокол DGTприведен в приложении 6 в виде заголовочного C файла (header).Задача РШП осуществлять трансляцию партий, при этом изменения позиции партийсохраняются в базу данных, откуда эти данные получает Транслятор шахматныхпартий (ТШП). Формат записи, в котором записываются шахматные ходы в базуданных, следующий:
[фигура{K(король),Q(ферзь),N(конь),B(слон),R(ладья),’ ’(пешка)}][вертикаль исходного поля][горизонтальисходного поля]-[вертикаль поля назначения][горизонталь поля назначения].
Например:
Kg8-g7
Ng1-f3
 e2-e4
Данные, получаемые РШП отэлектронной доски, интерпретируются согласно описанию в протоколе DGT. Например, дамп доски получается ввиде 64 ASCII символов (информативная частьсообщения) – ‘rnbqkbnrpppppppp PPPPPPPPRNBQKBNR’ преобразуется в вид:
/>
Рисунок 8 – Результатпреобразования информативной части сообщения от ЭШД
ТШП реализован натехнологии Ruby on Rails. Rails — это полноценный, многоуровневый фреймворкдля построения веб-приложений, использующих базы данных, который основан наархитектуре Модель-Представление-Контроллер (Model-View-Controller, MVC).Динамичный AJAX-интерфейс, обработка запросов и выдача данных в контроллерах,предметная область, отраженная в базе данных, — для всего этого Railsпредоставляет однородную среду разработки на Ruby. Все, что необходимо дляначала — база данных и веб-сервер. Rails отлично работает со многимивеб-серверами и СУБД. В качестве веб-сервера можно использовать Apache илиlighttpd как с FastCGI, так и с SCGI. В качестве СУБД можно использовать MySQL,PostgreSQL, SQLite, Oracle, SQL Server, DB2 или Firebird. Использовать Railsможно на практически любой операционной системе.
Задача ТШП создаватьтрансляции и вещать шахматные партии. В ТШП предусмотрена система авторизации,что позволяет гибко настраивать права пользователей зарегистрированных всистеме, по умолчанию существуют три профиля пользователей: Администратор(права на все), Руководитель (ему принадлежат права на создание/редактирование online трансляций, турниров,комментирование партий и т.д.) и Гость (только просмотр партий).
Модуль вещания партийреализован при помощи скриптов JavaScript, при этом обновление позиции запрашивается с сервера через AJAX запросы, без обновления всейстраницы.
Листинг модуля вещанияпартий представлен в приложении 10.
2.5 Описаниеразработанного программного комплекса
2.5.1 Трансляторшахматных партий
В общем виде трансляторшахматных партий (ТШП) представляет собой следующие структуры:
-   модели данных (models);
-   представления (views);
-   контроллеры (controllers);
-   помощники (helpers).
Модели данных содержат объектныепредставления, задачи в виде классов бизнес-логики. Здесь описываются классы, ккоторым будут отнесены реальные данные. Бизнес-логика управляется одноименнымконтроллером, например, класс Cities(города) управляется одноименным контроллером cities_controller.rb. Модель может иметь одно илинесколько представлений, которые отвечают за то, в каком виде будутотображаться данные. Помимо контроллеров всех классов существует главныйконтроллер main_controller.rb (в качестве главного может быть назначен любой контроллер). Онвыполняет все функции по обслуживанию шахматного интернет-портала:
-   отображениеглавной веб-страницы;
-   возврат кпредыдущей веб-странице;
-   показ партий врежиме реального времени (online)и архива турнирных партий (offline);
-   авторизацияпользователей;
-   вход в личныйкабинет пользователя;
-   напоминание при потерепароля или логина;
-   показ трансляции;
-   выгрузкашахматных партий в формате pgn (portable game notation);
-   выходпользователя;
-   интерфейс регистрациии т.д.
Снимки экрана (Screenshots) главной страницы rDGT-сервера, страницы авторизациипользователя, страницы просмотра текущих online трансляций и страницы просмотра шахматных партий представленыв приложении 5.
Скрипт трансляциишахматной партии реализован на языке Javascript. Обновление позиции осуществляется через асинхронные javascript-запросы к rDGT-серверу при использовании технологии Ajax без обновления всей страницы.
Клиентское приложение,содержит все необходимые функции, обеспечивающие корректную трансляциюшахматных партий. Оно создает отображение шахматной доски, фигур, временичасов, отображает динамику изменения позиции в соответствии с поступающими от rDGT-сервера данными, позволяетпользователю просматривать текущие партии, осуществлять навигацию попоследовательности ходов в любом порядке.
Веб-интерфейс реализованна платформе Ruby on Rails, в соответствии с идеологией изложенной в разделе 2.4. Портал можно разделить на несколько узловых разделов:
-   Раздел трансляцийпартий (online режим).
-   Раздел просмотрапартий, сохраненных на сервере (offlineрежим).
-   Разделредактирования данных портала, подразумевает авторизацию пользователя, которомудоступны:
·                добавление, удаление,изменение турниров;
·                добавление, удаление,изменение игроков;
·                добавление, удаление,изменение трансляций;
·                добавление, удаление,изменение данных различных справочников (регламент проведения турнира, часовыерегламенты, страны, города).
Общая структуратранслятора шахматных партий, все атрибуты и методы его структурных элементовпредставлены в приложении 7
2.5.2 Регистраторшахматных партий
Алгоритм работы:
Пользователь ввеб-интерфейсе формирует трансляцию партий, при этом он указывает следующиепараметры:
·    Названиепоследовательного порта (serial port), к которомуподключены доски, с которых будет происходить трансляция шахматных партий («COM1», «COM2» и т.п. для операционной системы Windows и «/dev/ttyS0»,«/dev/ttyS1» для операционной системы Linux).
·    Время началатрансляции.
·    Для каждой доскиуказывается игрок, играющий белым цветом, и игрок, играющий черным цветом.
·    Ассоциируетданную трансляцию с заранее заданным турниром.
Веб-сервер послесоставления заявки на трансляцию партий, запускает приложение jgdtnix, параметризуя его введеннымипараметрами. Jgdtnix до назначенного времени переходит в«спящий» режим, а за несколько минут до начала трансляции jgdtnix начинает опрашивать порт на наличиедоступных досок и регистрирует их. Во время трансляции jgdtnix с определенной периодичностью опрашивает порт,получает обновления позиции и данные с шахматных часов, и заносит ходы в базуданных.
Общая структура регистраторашахматных партий, все атрибуты и методы его структурных элементов представленыв приложении 8.
2.6 Тестовые испытания ианализ результатов
Тестовые испытания проводились в помещении СП «ШК» всроки с 5 июня по 11 июня 2008 года на Чемпионате области по шахматам средиюношей до 12 лет. Количество используемых в испытаниях ЭШД и электронныхшахматных часов – 5 штук,. Трансляция соревновательного процесса осуществляласьв течение всего указанного срока с 11:00 до 15:00, что соответствует длительностиигрового дня. Схема подключения ЭШД и электронных шахматных часов аналогичнарисунку 3 пункта «Обзор шахматных систем-прототипов» с той лишь разницей, чтотрансляция шахматных партий осуществлялась не только для присутствующейаудитории, но и в сети Интернет.
Анализ результатовтестовых испытаний представлен в приложении 9.
В качестве сравнительногопоказателя используется общее число шахматных ходов, сделанных на всех досках втечение всего соревновательного процесса. Так как число игровых дней – 7, числоучитываемых досок – 5, а среднее число ходов в шахматной партии 30, то общеечисло шахматных ходов равно равно 1050.
www.compress.ru/Archive/CP%5C2003%5C10%5C65/http:/www.cpress.ru/
/>/>/>/>/>3         Технико-экономическое обоснование проекта3.1     Целесообразность и область примененияразработки
В данномтехнико-экономическом обосновании рассматривается специализированное шахматноепрограммное обеспечение, разработанное для автоматизации деятельностиинформационной системы структурного подразделения «Шахматный клуб» в рамкахвнедрения комплексной информационной системы структурного подразделения«Шахматный клуб» ГОУ ВПО «Сибирский государственный индустриальныйуниверситет».3.1.1    Эффект от внедрения информационных систем
Информатизацияради информатизации не имеет смысла. Информационная система – это экономическийтовар, и как любой товар она имеет цену. Одним из первых критериев привнедрении такой системы является сопоставление выгод, приносимых ею, сзатратами на ее внедрение, сопровождение и поддержку, то есть цель должнаоправдывать средства.
Выгодуот внедрения информационной системы можно разделить на две составляющие — организационную и экономическую. Первая связана с общими изменениями учебного исоревновательного процессов, внедрением более прогрессивных методов проведенияспортивных состязаний, повышением общей культуры управления, снижениембумажного документооборота, использованием новых, более оптимальных схемпостроения учебного и соревновательного процессов. Это, так сказать,качественные улучшения, и они являются скорее следствием, чем цельюинформатизации. Улучшения с ними связанные, представляют набор управленческихрешений, позволяющий успешнее достигать целей, поставленных руководством.
Помимоповышения общей культуры управления, информатизация помогает учреждению впостроении взаимоотношений с потенциальными партнерами и инвесторами. Несекрет, что спонсоры заинтересованы в экономически привлекательныхинформационных системах, которые могут быть использованы не только понепосредственному назначению, но и в рекламных целях.
Подэкономическими выгодами от внедрения подразумевается получение реальнойэкономической отдачи от использования всего пакета приложений или отдельныхфункциональных блоков. Согласно статистике внедрение информационных систем исистем информационного сопровождения может обеспечить следующую отдачу:
·         устранениеручной подготовки и сопровождения документов;
·         уменьшениезатрат на административно-управленческий аппарат;
·         болееточный учет затрат;
·         болееполное информационное обеспечение конечных пользователей и потребителей;
·         уменьшениесроков информирования конечных пользователей и потребителей.
Дажесамая лучшая в мире компьютерная система не в состоянии выполнить роль«волшебной палочки», как по мановению снимающей все накопившиеся проблемы.Внедрение информационной системы – это совместный труд, как поставщика, так изаказчика. Такая система призвана в первую очередь поддерживать регулярныйменеджмент. Если же в учреждении такового не существует или нет хотя бы попытокего наладить, информационная система изначально обречена быть «инороднымтелом». Поэтому реальную отдачу от информационной системы можно получить толькопри правильной организации проекта внедрения и при желании первых лицорганизации создать прибыльную, эффективно работающую структуру информационногосопровождения. />/>/>
3.1.2    Информатизация деятельности СП «ШК»
Внастоящее время на рынке программных продуктов существуют различные прикладныеинформационные решения для информационного обеспечения деятельности структурногоподразделения «Шахматный клуб». Однако у всех у них один общий и весьмасущественный недостаток – отсутствие поддержки трансляций соревновательногопроцесса в сети Интернет и локальных сетях. Программное обеспечение подобногорода зачастую является объектом интеллектуальной собственности ираспространяется по решению владельцев. Программное обеспечение, поставляемое вкомплекте с электронными шахматными досками, не отвечает необходимымтребованиям и во многих случаях является нерабочим.
Из этойситуации есть 3 выхода: приглашать специалистов из международных шахматныхорганизаций на обслуживание процесса соревнований, что влечет за собой весьмазначительные расходы; пытаться найти качественное программное обеспечение нарынке, что весьма проблематично, так как владельцы интеллектуальнойсобственности не хотят с ним расставаться, а предпочитают пользоваться имсамостоятельно, зарабатывая деньги на обслуживании соревнований; разрабатыватьсобственное программное обеспечение.
Первые два пути были ужеопробованы. На обслуживание Всемирной студенческой универсиады, проводившейся с3 по 11 марта 2008 года были приглашены специалисты из информационного центрароссийской шахматной федерации. В результате эти услуги обошлись организаторампримерно в 100000 рублей, что весьма накладно. После проведения этого крупногоспортивного форума организаторами была предпринята попытка наладитькоммерческие связи с обслуживающими турнир специалистами с целью покупкипрограммного обеспечения для личного использования, однако это предложение былопроигнорировано. В связи с этими обстоятельствами автором дипломного проекта посогласованию с руководством структурного подразделения «Шахматный клуб» ГОУ ВПО«СибГИУ» и руководством МУДОД «СДЮСШОР по шахматам имени Б. А. Кустова» было приняторешение о самостоятельной разработке специализированного шахматногопрограммного обеспечения с целью личного и коммерческого использования.
3.2     Расчетзатрат на разработку специализированного шахматного программного обеспечения
Просчитаемэкономическую эффективность разработки специализированного программногообеспечения в денежном эквиваленте.
Затраты на разработку специализированного программногообеспечения складываются из заработной платы разработчикам, расходов наприобретение, монтаж и эксплуатацию оборудования, материалов, расходов наприобретение лицензионных программных продуктов, необходимых для разработки.
Разработчикамиспециализированного программного обеспечения являются: руководитель проекта –администратор МУДОД «СДЮСШОР по шахматам им. Б.А.Кустова» и инженерструктурного подразделения «Шахматный клуб».
В таблице 1 представленыосновные этапы проведения работы.
Таблица1 — Оценка загрузки исполнителей

этапа Наименование работ Длитель-ность, дни Исполнитель Коэффициент загрузки, проценты 1 Постановка задачи 3 руководитель 50% инженер 50% 2 Сбор исходных материалов 3 руководитель 75% инженер 25% 3 Определение требований к программе 3 руководитель 50% инженер 50% 4 Согласование и утверждение ТЗ 2 руководитель 50% инженер 50% 5 Изучение литературы по теме задания 7 инженер 100% 6
Уточнение структуры и формы представления данных.
Разработка структуры программы 7 инженер 100% 7
Разработка плана мероприятий по внедрению программы,
пояснительной записки. 3 инженер 100% 8 Программирование 20 инженер 100% 9 Тестирование программы 7 инженер 100% 10 Написание программной документации 7 инженер 100% 11 Подготовка и передача программы и программной документации для сопровождения и утверждения. 7 инженер 25% руководитель 75% Итого 69
3.2.1    Затраты на оплатутруда разработчиков программы
Размер месячного оклададля инженера структурного подразделения «Шахматный клуб» составляет 3000рублей.
Размер месячного оклададля руководителя составляет 4000 рублей.
Полагая,что в месяце 21 рабочий день, рассчитаем стоимость одного рабочего дня. Расчетоклада разработчиков программы за один рабочий день приведен в таблице 2.
Расчетосновной заработной платы приведен в таблице 3.
Таблица2 — Расчет оклада сотрудников за один рабочий деньДолжность Оклад в месяц, руб. Стоимость одного рабочего дня, руб. Руководитель 4 000,00 190,48 Программист 3 000,00 142,86
Таблица3 — Расчет основной заработной платы сотрудников за период разработки программыИсполнитель Трудоемкость, дней Стоимость одного рабочего дня, руб. Сумма, руб. Руководитель 11,5 190,48 2190,52 Программист 57,5 142,86 8214,45 Итого 69 333,34 10404,97
3.2.2    Затраты наотчисление единого социального налога
Отчисленияпо единому социальному налогу (ЕСН), который составляет 26 % от заработнойплаты, равны:
ЗЕСН=10404,97*0.26=2705,29 руб.
3.2.3   Затраты наприобретение оборудования для разработки специализированного программногообеспечения
Затраты на приобретение оборудования определяются по формуле:
/>                                                                        (1)
где /> – стоимостьоборудования;
/> – затраты на транспортировку (8% от />);
/> – затраты на монтаж (10% от />).
Перечень приобретенного оборудования и затраты на негоприведены в таблице 4.
Таблица4 — Перечень приобретенного оборудования и затраты на негоНаименование оборудования Количество
/>, руб.
/>, руб.
/>, руб.
/>, руб. Принтер (HP LaserJet 1010) 1 5200 416 520 6136 Манипулятор Logitech 2 1200 96 120 1416 Итого: 6 200 496 620 7552

3.2.4    Затраты наприобретение материалов
Наэту статью относится стоимость материалов, покупных изделий, полуфабрикатов идругих материальных ценностей, расходуемых непосредственно в процессевыполнения проекта. Цена материальных ресурсов определяется по соответствующимценникам. В стоимость материальных затрат включаются транспортные расходы (5%от прейскурантной цены). Расчет статьи «Материалы» приводится в таблице 5.
Таблица5 — Материалы и покупные изделия и услугиНаименование Единица измерения Количество Цена за единицу, руб Стоимость, руб. Бумага для принтера пачка 1 120 120 Чернила мл 100 0,8 80 Лазерные диски шт 5 15 75 Оплата за интернет час 15 30 450 Итого: 725
3.2.5    Затраты наприобретение лицензионных программных продуктов
Дляразработки специализированного шахматного программного обеспечения требуютсяследующие лицензионные программные продукты:
·         средаразработки NetBeans IDE 6.0;
·         программныйпакет для создания и разработки баз данных MySQLAdministrator;
·         программныйпакет Ruby-186-26;
·         драйверопроса электронных шахматных досок dgtnix.
Всеперечисленные программные продукты являются абсолютно бесплатными. Первый,второй и третий из них распространяются по лицензии с открытым исходным кодомLGPL, последний из них также распространяется бесплатно, но по лицензии соткрытым исходным кодом GPL.

3.2.6   Затраты напотребляемую электроэнергию
Кэтой статье относится стоимость потребляемой электроэнергии компьютером завремя разработки программы.
Стоимостьэлектроэнергии, потребляемой при разработке специализированного программногообеспечения, определяется по формуле (2):
/>                                                                                                                            (2)
где/> – суммарная мощность ЭВМ,кВт;
/> – время работы компьютера, час;
/> – стоимость 1 кВт*ч электроэнергии,руб.
Посколькустандартный рабочий день равен 8 часам, то
/>,
где/> – время эксплуатациикомпьютера при создании специализированного программного обеспечения, дней.
Следовательно,стоимость электроэнергии за период работы компьютера во время созданияспециализированного шахматного программного обеспечения будет вычисляться поформуле (5):
/>,                                                                                                               (3)
Согласнотехническому паспорту ЭВМ Рэвм=0,25 кВт, а стоимость 1 кВт/чэлектроэнергии по городу /> =0,96руб.
Тогдарасчетное значение затрат на электроэнергию:

/>
3.2.7    Накладные расходы
Накладные расходы включаются в сумму затрат на разработкуспециализированного программного обеспечения и принимаются 10% от затрат назаработную плату и ЕСН.
/>
3.2.8   Смета затрат наразработку системы
Смета затрат на разработку системы приведена в таблице 6.
Таблица6 — Смета затрат на разработку системыНаименование затрат Сумма, руб. Затраты на заработную плату разработчикам 10404,97 Затраты на ЕСН 2705,29 Затраты на приобретения оборудования для разработки системы 7552 Затраты на приобретение материалов 725 Затраты на приобретение лицензионных программных продуктов – Затраты на электроэнергию 178,56 Накладные расходы 1311,03 Итого: 22876,85
3.3     Расчетэксплуатационных затрат
Эксплуатационные затраты определяются по формуле:
/>                                               (4)
где />– затраты назаработную плату;
/> – затраты на амортизационныеотчисления;
/> – затраты на электроэнергию;
/> – затраты на материалы;
/> – затраты на текущий ремонтоборудования и устройств системы;
/> – накладные расходы.
3.3.1   Затраты назаработную плату
За работоспособностью специализированного шахматныйпрограммного обеспечения будет следить инженер структурного подразделения«Шахматный клуб», доля заработной платы которого составляет 500 рублей в месяц.
Отчисления ЕСН (26%)составят: 500*0,26 = 130 рублей/месяц
3.3.2   Затраты наамортизационные отчисления
Амортизационные отчисления рассчитываются по формуле:
/>                                                                                  (5)
где /> - стоимостьоборудования, руб.;
/> — норма амортизации.
Расчет затрат на амортизацию приведен в таблице 7.
Таблица7 — Затраты на амортизационные отчисленияНаименование Кол. Общая стоимость, руб. Норма амортизации, %. Сумма, руб. Принтер (НР LaserJet 1010) 1 6 136 12,5 767 Манипулятор Logitech 2 1416 12,5 177 Итого: 944
3.3.3    Затраты на электроэнергию
Затраты на электроэнергию рассчитываются по формуле:
/>                                                                          (6)
где/> – мощность i-гооборудования;
n – количество токоприемников;
/>– время работы i-того оборудования,час.
/>                                                                                    (7)
где />– количестворабочих дней в году;
/>– норматив среднесуточной загрузки, ч.;
/> – коэффициент использования i-того оборудования;
/>– стоимость 1 кВт/ч электроэнергии.
Расчет затраты на электроэнергию приведены в таблице 8.

Таблица 8 — Расчет затратна электроэнергиюНаименование устройства Кол. Р, Вт Дг, дней
/>ч. Т, ч. К Сэл (кВт/ч), руб. Зэл, руб. ПК (Celeron 1.7 GHz) 1 250 366 8 2920 0,5 0,96 350,4 Монитор (Samsung 17") 1 80 366 8 2920 0,5 0,96 112,13 Принтер (НР LaserJet 1010) 1 200 366 6 2190 0,1 0,96 42,05 Итого: 504,58
3.3.4  Затраты наматериалы
Перечень расходных материалов и затраты на них приведен втаблице 9.
Таблица9 — Перечень расходных материалов и затраты на нихНаименование материала Количество Стоимость за 1 ед., руб.
Доставка (8%),
руб. Сумма, руб. Бумага офисная (формат А4) 4 120 9,6 518,4 Тонер для принтера 3 180 14,4 583,2 Итого: 1 101,6
3.3.5   Затраты натекущий ремонт оборудования и устройств системы
Затраты на текущий ремонт оборудования составляют 5% в год отего стоимости (таблица 10).
Таблица10 — Расчет затрат на текущий ремонт оборудованияНаименование оборудования Кол. Общая стоимость, руб. Норматив затрат на ремонт, % Сумма, руб. Принтер (НР LaserJet 1010) 1 5 200 0,05 260 Манипулятор Logitech 2 1 200 0,05 60 Итого: 320
3.3.6   Сметаэксплуатационных затрат
Смета эксплуатационных затрат приведена в таблице 11.
Таблица11 — Смета эксплуатационных затратНаименование затрат Сумма, руб. Затраты на заработную плату 6000 Затраты на ЕСН 1560 Затраты на амортизационные отчисления 944 Затраты на электроэнергию 504,58 Затраты на материалы 1 101,6 Затраты на текущий ремонт оборудования и устройств системы 320 Итого: 10430,18
3.4     Оценкаэкономической эффективности проекта
Для выяснения экономической выгоды от разработкиспециализированного шахматного программного обеспечения необходимопроанализировать и оценить его преимущества.
Данная разработка предназначена для информационногообеспечения учебного процесса и спортивных состязаний, проводимых в структурномподразделении «Шахматный клуб» ГОУ ВПО «СибГИУ», а также спортивных состязанийпо шахматам любого уровня, проводимых с использованием электронных шахматныхдосок DGT. Она обеспечит эффективное информационное сопровождение проводимых впомещении структурного подразделения «Шахматный клуб» спортивных состязаний,освещение соревновательного процесса в сети Интернет и локальной сети ГОУ ВПО«СибГИУ», позволит полностью отказаться от периодических услуг наемных рабочих.Кроме того, данная разработка будет приносить прибыль при коммерческомиспользовании.
Годовая экономия отвнедрения системы определяется по формуле:
/>                                                                         (8)
где Э1, Э2,Э3 – экономия в год по факторам;
Сэкс –эксплуатационные затраты в год.
3.4.1Исключение расходовна услуги наборщиков
Каждый год в помещенииструктурного подразделения «Шахматный клуб» проводится в среднем 10 крупныхспортивных состязаний, на период проведения которых нанимается 2 наборщика, вобязанности которых входит перевод записи шахматных партий из бумажной формы вэлектронную. Величина оплаты услуг одного наборщика за один турнир составляет2000р. Таким образом, общие расходы на услуги наборщиков составляют 40000р. вгод.
Данное специализированноепрограммное обеспечение позволяет полностью автоматизировать перевод записишахматных партий в электронную форму.
Э1=40 000 руб.
3.4.2 Исключение затрат на освещение соревнований в сетиИнтернет
Все значительные соревнования, проводящиеся в помещенииструктурного подразделения «Шахматный клуб» согласно регламенту должны бытьосвещены в сети Интернет. Освещение соревновательного процесса в сети Интернетвходит в обязанности главного арбитра соревнований. Главный арбитркомандируется городским МУДОД «СДЮСШОР по шахматам им. Б.А. Кустова» вшахматный клуб ГОУ ВПО «СибГИУ» на проведение турнира. Расходы по оплате работыглавного судьи по проведению спортивных состязаний берет на себя городскоеМУДОД «СДЮСШОР по шахматам им. Б. А. Кустова». В тех случаях, когда необходимоосвещение спортивного форума в сети Интернет, данная услуга оплачиваетсяотдельно шахматным клубом ГОУ ВПО «СибГИУ». Из 10 крупных турниров,проводящихся за год в помещении структурного подразделения «Шахматный клуб»минимум 5 освещаются в сети Интернет.
Расходы на освещение соревнований в сети Интернетпредставлены в таблице 12.
Таблица 12. Расходы на освещение соревнований в сети ИнтернетНаименование затрат
Затраты за
1 турнир (руб) Годовой объем затрат (руб) Выкладка всей информации о соревнованиях в сети интернет 2 000 10 000 Дополнительные затраты за пользование Интернетом (руб/час) 300 1 500 Итого 11 500
Разработанное специализированное шахматное программноеобеспечение уже включает в себя web-сайт, на котором в режиме реального времениведется трансляция соревнований, проводящихся в помещении структурногоподразделения «Шахматный клуб». На данном сайте отображается вся информация осоревнованиях, сохраняются все текущие и предыдущие партии. Таким образом,отпадает необходимость оплаты дополнительных услуг главного арбитра соревнованийпо выкладке информации в сети Интернет, а также отпадает необходимость вдополнительных затратах за пользование Интернетом, так как трансляция ведется врежиме реального времени и отсутствует необходимость в дополнительных временныхзатратах.
Э2=11 500 руб.

3.4.3 Прибыль от коммерческого использования разработки
В настоящее время в Сибирском федеральном округе проводитсяежегодно около сотни крупных шахматам форумов. Каждый такой турнир нуждается винформационном сопровождении и услугах наборщиков шахматных партий. В среднемна информационное сопровождение и набор партий одного крупного шахматноготурнира тратится от 10000 до 100000 рублей (в зависимости от масштабовсоревнований), включая услуги наборщиков, освещение соревнований в сетиИнтернет и средствах массовой информации. Использование разработанногоспециализированного программного обеспечения в сочетании с электроннымишахматными досками DGT позволит полностью или частично отказаться от услугнаборщиков, автоматизировать процесс трансляции соревнований в сети Интернет илокальных сетях, упростить процесс освещения спортивных состязаний в средствахмассовой информации. Таким образом, в сфере проведения спортивных шахматныхсостязаний данная разработка будет востребованной.
Полная оценка размеров прибыли от коммерческого использованияданной разработки весьма проблематична, так как должна включать в себядетальные маркетинговые исследования, учет затрат на оформление авторских прав,рекламу, сервисное обслуживание, хостинг и т.д. Данную оценку еще толькопредстоит произвести, что является одним из приоритетных направлений дальнейшейдеятельности. Но уже сейчас ясно, что данная разработка будет приноситьприбыль, так как ею заинтересовались специалисты из информационного центрароссийской шахматной федерации.
Факторы годовой экономиипри внедрении системы (без учета прибыли от коммерческого использованияразработки) приведены в таблице 13.

Таблица 13 — Факторыгодовой экономии при внедрении системы
Эi Фактор экономии Сумма, руб.
Э1 Исключение расходов на услуги наборщиков 40 000
Э2 Исключение затрат на освещение соревнований в сети Интернет 11 500 Итого: 51 500
Таким образом, годовая экономия может составить:
Э=51500 – 10 430,18 = 41 069,82 руб.
Экономическая эффективность единовременных затрат на созданиесистемы определяется показателями Тр и Ер, где Тр – расчетный срок окупаемостиединовременных затрат на создание системы в годах, Ер – расчетный коэффициентэффективности единовременных затрат на создание системы:
/>
/>
/>
/>
Сопоставляя расчетный коэффициент и срок окупаемости системыс нормативными, находим, что /> и />. Следовательно, даннаяразработка экономически эффективна и целесообразна.

3.5 Технико-экономические показатели проекта
Технико-экономические показатели проекта представлены втаблице 14.
Таблица14. Технико-экономические показатели проекта№ п/п Наименование показателя Ед. изм. Значение показателя 1 Проектные затраты Руб. 22 876,85 1.1 Затраты на оборудование Руб. 7552 1.2 Затраты на приобретение материалов Руб. 725 1.3 Затраты на заработную плату разработчикам Руб. 10 404,97 1.4 Затраты на отчисления ЕСН Руб. 2 705,29 1.5 Затраты на электроэнергию Руб. 132,48 1.6 Накладные расходы Руб. 1 311,03 2 Эксплуатационные затраты Руб. 10 430,18 2.1 Затраты на амортизационные отчисления Руб. 944 2.2 Затраты на текущий ремонт оборудования и устройств системы Руб. 320 2.3 Затраты на ЕСН Руб. 1 560 2.4 Затраты на заработную плату Руб. 6 000 2.5 Затраты на электроэнергию Руб. 504,58 2.6 Затраты на материалы Руб. 1 101,6 3 Годовая экономия Руб. 51 500 3.1 Исключение расходов на услуги наборщиков Руб. 40 000 3.2 Исключение затрат на освещение соревнований в сети Интернет Руб. 11 500 4 Экономия при внедрении разработанного проекта Руб. 41 069,82 5 Срок окупаемости проекта Мес. 0,56
/>4. Безопасность и экологичность проекта/>4.1 Безопасность труда/> 4.1.1 Анализ условий труда на рабочем месте инженера структурногоподразделения «Шахматный клуб» ГОУ ВПО «СибГИУ»
Объектом анализа являютсяусловия труда на рабочем месте инженера структурного подразделения «Шахматныйклуб» ГОУ ВПО «СибГИУ», расположенном по адресу ул. Кирова, 42.
Анализусловий труда выполнен для рабочего кабинета инженера структурногоподразделения «Шахматный клуб» ГОУ ВПО «СибГИУ», которое располагается впристройке к главному корпусу СибГИУ на третьем этаже над помещением столовой.Параметры рабочего кабинета инженера: площадь – 12 м2, периметр – 14 м. В рабочем кабинете инженера располагается 3 компьютера. Помещениеоборудовано системой отопления и приточно-вытяжной вентиляцией, соответствующей[1].
Длявнутренней отделки интерьера рабочего кабинета инженера с ВДТ и ПЭВМ использованыматериалы с коэффициентом отражения для потолка — 0,7; для стен — 0,5; для пола- 0,3, соответствующие [2].
Поверхностьпола в рабочем кабинете инженера ровная, без выбоин, нескользкая, удобная дляочистки и влажной уборки, обладает антистатическими свойствами.
Пыль,оседающая на экране, снижает его освещенность, ухудшает видимость изображения испособствует накоплению статического электричества.
В помещении сПЭВМ ежедневно проводиться влажная уборка, что соответствует [2].
При работе с компьютеромпользователь подвергается воздействию ряда опасных и вредных производственныхфакторов, которые по природе действия подразделяются на следующие группы [3]:
· поражение электрическим током;
· механические повреждения;
· электромагнитное излучение;
· инфракрасное излучение;
· опасность пожара;
· повышенный уровень шума и вибрации.
Нормативныедокументы [1] — [7] предусматривают создание на рабочем месте условий труда,при которых влияние опасных и вредных факторов на работающих либо допустимо,либо находится в допустимых пределах.
Проведемоценку условий труда на рабочем месте (таблица 15).
Таблица 15 — Оценкаусловий труда на рабочем местеФактор Оценка условий труда Фактич. условия Норматив. значение Ссылка на норматив Величина соотв./несоотв. Микроклимат
Температура,0С
холодный период года
теплый период года
20-22
22-25
20-24
21-28  [4] соответствует
Относительная
влажность воздуха,% 50-60 60 соответствует Скорость движения воздуха, м/с 0,1 0,1-0,2 соответствует Освещение Естественное, % 1,6 > 1,5  [5] соответствует Искусственное, лк 300 300-500 соответствует Шумовое воздействие Уровень шума, дБ 60 61  [6] соответствует Электромагнитное Напряженность электрического поля  [7] 5 Гц-2 кГц 24 В/м 25 В/м соответствует 2кГц-400 кГц 2.3 В/м 2.5 В/м соответствует Плотность магнитного потока 5 Гц-2 кГц 238 нТл 250 нТл соответствует 2кГц-400 кГц 22 нТл 25 нТл соответствует /> /> /> /> /> /> />
Работаинженера структурного подразделения «Шахматный клуб» ГОУ ВПО «СибГИУ» относитсяк категории 1б, т.е. это работа, производимая сидя, стоя или связана с ходьбойи сопровождается некоторым физическим напряжением, при которых расход энергиисоставляет от 140 до 232 Дж/с [2].
Анализ этойтаблицы позволяет охарактеризовать условия работы как оптимальные. В целяхоптимизации условий труда проектом разработаны мероприятия по безопасноститруда./>4.1.2 Мероприятия по безопасности труда
Разработанные проектоммероприятия соответствуют требованиям, предъявляемым при работе за компьютером[2].
Таблица 16 – Факторывоздействия на рабочем месте и используемые средства защитыВредные факторы Используемые средства защиты Электромагнитное излучение Соблюдение расстояния от глаз оператора до монитора не менее 70 см Статическое электричество Заземление компьютеров и электрооборудования, влажная уборка Перенапряженность зрительных анализаторов
Правильная ориентация компьютера, чтобы свет падал слева.
Наличие жалюзи. Монотония
При 8-ми часовом рабочем дне работа за компьютером не более 6 часов.
Скорость набора не более 120 знаков в минуту.
4.1.2.1 Организациярабочих мест
Высота рабочего столасоставляет 720 мм. Размеры столешницы составляют 1400 х 800 мм, что соответствует оптимальному размеру. Под столешницей рабочего стола есть свободноепространство для ног с размерами по высоте не менее 600 мм, по ширине не менее 500 мм, по глубине — 650 мм, что соответствует [2].
Конструкция одноместногостола для работы с ПЭВМ и ВДТ должна предусматривает две раздельные поверхности:одна — горизонтальная для размещения ПЭВМ или ВДТ и вторая — для клавиатуры.Отсутствуют ящики.
Корпус ВДТ и ПЭВМ,клавиатура и другие блоки и устройства ПЭВМ имеют матовую поверхность одногоцвета, не имеет блестящих деталей, способных создавать блики. В конструкции ВДТпредусмотрены кнопки регулировки яркости и контраста. Они обеспечиваютвозможность регулировки этих параметров от минимальных до максимальныхзначений.
Размер экрана должен бытьне менее 17 дюймов по диагонали, при этом расстояние от глаз до экрана должнобыть в пределах 40 – 80 см.
Клавиатура исполнена ввиде отдельного устройства с возможностью свободного перемещения. Конструкцияклавиатуры предусматривает опорное приспособление, позволяющее изменять уголнаклона поверхности клавиатуры в пределах от 5 до 15 градусов. Высоту среднегоряда клавиш не более 30 мм.
При защите отэлектромагнитных и электростатических полей допускается применение приэкранныхфильтров, специальных экранов и других средств индивидуальной защиты, прошедшихиспытания в аккредитованных лабораториях, и имеющих соответствующийгигиенический сертификат.
Все описанные параметры ихарактеристики соответствуют [2].
4.1.2.2Освещенность рабочего места
В рабочемкабинете инженера структурного подразделения «Шахматный клуб» ГОУ ВПО «СибГИУ»предусмотрено естественное и искусственное освещение. Естественное освещение всоответствии с требованиями [5] осуществляется через светопроемы,ориентированные на север и северо-восток. Освещенность на поверхности стола иклавиатуре должна быть не менее 300 люкс, а вертикальная освещенность экрана — всего 100-250 люкс.
В качествеисточников света при искусственном освещении применяются люминесцентные лампы типаЛБ – 40 в количестве 3 штук. Светильники располагаются локализовано над рабочимстолом ближе к его переднему краю, обращенному к оператору.
4.1.2.3Расчет освещенности рабочего кабинета инженера структурного подразделения«Шахматный клуб» ГОУ ВПО «СибГИУ».
Высота – 4 м, длина – 4 м, ширина – 3 м
Потолок истены рабочего кабинета инженера структурного подразделения «Шахматный клуб»ГОУ ВПО «СибГИУ» побелены. Используются лампы ЛБ-40.
Рассчитаемколичество светильников, необходимое в рабочем кабинете инженера структурногоподразделения «Шахматный клуб» ГОУ ВПО «СибГИУ», по методу коэффициентаиспользования светового потока [5].
/>
Ен = 300 лк
S= 4* 3 = 12 />
Z= 1.1
k= 1.3
F= 3000 лм
n= 2
I =(4*3)/(2.78*(4+3))= 0,62
h = 4 – 0.5 –0.72 = 2.78 м
hc = 0.5 м (высота светильника)
hр = 0.72 м (высота рабочего стола)
η = 0,29
/> (шт)
Для освещениярабочего кабинета инженера структурного подразделения «Шахматный клуб» ГОУ ВПО«СибГИУ» размерами 4м х 3м х 4 м потребуется 3 светильника с люминесцентнымилампами типа ЛБ – 40. В рабочем кабинете инженера установлено 3 светильника,что соответствует [5]./> 4.2 Чрезвычайные ситуации4.2.1Электробезопасность
Припользовании средствами вычислительной техники и периферийным оборудованиемкаждый пользователь должен внимательно и осторожно обращаться сэлектропроводкой, приборами и аппаратами и всегда помнить, что пренебрежениеправилами безопасности угрожает и здоровью, и жизни человека.
Во избежаниепоражения электрическим током необходимо твердо знать и выполнять следующиеправила безопасного пользования электроэнергией.
Необходимопостоянно следить на своем рабочем месте за исправным состояниемэлектропроводки, выключателей, штепсельных розеток, при помощи которыхоборудование включается в сеть, и заземления. При обнаружении неисправностинемедленно обесточить электрооборудование, оповестить администрацию.Продолжение работы возможно только после устранения неисправности.
Во избежаниеповреждения изоляции проводов и возникновения коротких замыканий неразрешается:
·         вешать что-либона провода;
·         закрашивать ибелить шнуры и провода;
·         закладыватьпровода и шнуры за газовые и водопроводные трубы, за батареи отопительнойсистемы;
·         выдергиватьштепсельную вилку из розетки за шнур, усилие должно быть приложено к корпусувилки.
Дляисключения поражения электрическим током запрещается:
·         часто включать ивыключать компьютер без необходимости;
·         прикасаться кэкрану и к тыльной стороне блоков компьютера;
·         работать насредствах вычислительной техники и периферийном оборудовании мокрыми руками;
·         работать насредствах вычислительной техники и периферийном оборудовании, имеющих нарушенияцелостности корпуса, нарушения изоляции проводов, неисправную индикациювключения питания, с признаками электрического напряжения на корпусе;
·         класть насредства вычислительной техники и периферийное оборудование посторонниепредметы.
Запрещаетсяочищать от пыли и загрязнения электрооборудование, находящееся под напряжением.
Запрещаетсяпроверять работоспособность электрооборудования в неприспособленных дляэксплуатации помещениях с токопроводящими, сырыми полами, не позволяющимизаземлить доступные металлические части.
Ремонтэлектроаппаратуры производится только специалистами-техниками с соблюдениемнеобходимых технических требований.
Недопустимопод напряжением проводить ремонт средств вычислительной техники и периферийногооборудования.
Во избежаниепоражения электрическим током, при пользовании электроприборами нельзя касатьсяодновременно каких-либо трубопроводов, батарей отопления, металлическихконструкций, соединенных с землей.
Припользовании электроэнергией в сырых помещениях соблюдать особую осторожность.
Приобнаружении оборвавшегося провода необходимо немедленно сообщить об этомадминистрации, принять меры по исключению контакта с ним людей. Прикосновение кпроводу опасно для жизни.
Спасениепострадавшего при поражении электрическим током главным образом зависит отбыстроты освобождения его от действия током.
Во всехслучаях поражения человека электрическим током немедленно вызывают врача. Доприбытия врача нужно, не теряя времени, приступить к оказанию первой помощипострадавшему.
Необходимонемедленно начать производить искусственное дыхание, наиболее эффективным изкоторых является метод “рот в рот”, а также наружный массаж сердца.
Искусственноедыхание пораженному электрическим током производится вплоть до прибытия врача.
4.2.2Пожарная безопасность
Всоответствии с [8] кабинеты с ВДТ по пожарной опасности относятся к категории“В”, т.к. в помещении находятся электронная аппаратура, офисная техника ибумага.
Причины,которые могут повести за собой возгорание различных предметов, заключены вследующем:
·         перегрузкиэлектрических сетей;
·         неисправностьэлектропроводки, электрооборудования и неумелое их использование;
·         самовозгораемостьнекоторых веществ;
·         несоблюдениеправил техники безопасности;
·         курение иприменение открытого огня в неположенном месте;
·         короткоезамыкание в электрооборудовании;
·         диверсионно-террористическиеакции.
Порядок ипоследовательность действий:
·         сообщение опожаре;
·         эвакуация студентовиз горящих помещений;
·         сверка списочногосостава с фактическим наличием эвакуированных;
·         тушениевозникшего пожара.
Необходимознать, что:
·         при обнаружениипожара, загорании или задымлении немедленно звонить по телефону 01;
·         при возникновениипожара эвакуация производится через запасные выходы корпуса, столовой и зданияглавного корпуса «СибГИУ»;
·         при возникновениипожара в части здания, имеющей выход на улицу, эвакуацию производить череззапасные выходы столовой, главного корпуса и поточных аудиторий;
·         всеэвакуированные пересчитываются и сверяются по списку;
·         тушение загоранияпроизводится немедленно с момента его обнаружения.
Исполнители:
·         первый заметившийдым и дежурный по корпусу;
·         дежурныйпомещений и преподаватели, проводившие занятия;
·         преподаватели истаросты групп;
·         члены ДПД.
В СибГИУимеется и успешно функционирует собственная противопожарная система, котораясостоит из противопожарной службы, средств пожаротушения иорганизационно-технических мероприятий.
Противопожарнаяслужба состоит из штатных работников отдела обеспечения порядка, которые своимисилами способны тушить пожар любой степени сложности. Численность работниковотдела обеспечения порядка 30 человек. Главное в их работе – предотвратитьпожар. Если возгорание произошло, то основная задача – остановить его, не датьперерасти в пожар. Основной причиной возгорания в здании университета являетсянезатушенная сигарета. Повреждение электропроводки также может привести квозгоранию, а затем и к пожару.
К средствампожаротушения относятся средства коллективной и индивидуальной защиты.
Средстваколлективной защиты:
·         огнетушителипорошковые ОП-3;
·         гидранты;
·         пожарные рукава.
Средстваиндивидуальной защиты:
·         противогазы ГП5;
·         респираторы.
Все видысредств защиты в достаточном количестве имеются на постах службы обеспеченияпорядка.
В главномкорпусе СибГИУ располагается пожарный пост №1, где находятся первичные средствапожаротушения (на начальной стадии развития пожара): огнетушители, песок,войлок, кошма, асбестовое полотно, ведра, лопаты и др. Там же находится иформа.
Источникиводоснабжения:
·         пожарныегидранты;
·         пожарные краны –58 шт.
Пожарныекраны размещены в шкафчиках, на дверцы которых нанесен буквенный индекс “ПК” ипорядковый номер крана. Каждый пожарный кран оборудован рукавом длиной 20 м и пожарным стволом со спрыском. Пожарные рукава бывают всасывающие и напорные. При помощивсасывающих рукавов забирают воду из водоисточников пожарным насосом. Напорныерукава применяют для подачи воды к месту пожара от водоисточника иливодопроводного крана.
Пожарнаясигнализация в главном корпусе находится только в компьютерных классах, в виде:
·         дымовых датчиков;
·         термическихдатчиков.
Основныммероприятием по защите людей при пожаре является полная экстренная эвакуация.Планы эвакуации висят на всех этажах во всех корпусах университета. />4.2.3 Организационно-штатная структура по ГО и ЧС.
В руководящий составвходят начальник ГОЧС (Кулагин Николай Михайлович), начальник штаба ГОЧС(Герасимова Анна Алексеевна), председатель эвакуационной комиссии (ГалевскийГеннадий Владиславович) и начальник СЭП (Рябцев Вадим Олегович).
Силы ГОЧС составляютспасательная команда (105 человек), группы оповещения и связи (30 человек),команда охраны общественного порядка (45 человек), санитарные дружины (72человека) и звенья пожаротушения (20 человек)./>4.2.4 Чрезвычайные ситуации, которые могут возникнуть натерритории ГОУ ВПО «СибГИУ».
Чрезвычайные ситуации,которые могут возникнуть на территории ГОУ ВПО «СибГИУ», связанные с опасностьюдля здоровья, гибелью и увечьем студентов и персонала:
·         пожаро-взрывоопаснаяситуация;
·         утечка хлора вплавательном бассейне спорткомплекса университета;
·         производственныеаварии на Левобережном водозаборе, на его технологических линиях и емкостях схлором, при неблагоприятных метеоусловиях и направлении ветра от места аварии всторону университета;
·         аварии нажелезной дороге, пролегающей в непосредственной близости к ГОУ ВПО «СибГИУ» сразливом АХОВ или взрывом особо опасного груза;
·         неблагополучнаяобстановка в городе, в центральном районе, связанная с возникновением очаговособо опасных инфекционных заболеваний;
·         ураганный ветер,землетрясения, наводнения и другие стихийные бедствия./>4.2.5 Способы оповещения при ЧС
Звучание сирен,прерывистые гудки предприятий и транспортных средств означает подачупредупредительного сигнала “Внимание всем!”.
Услышав его, следуетнемедленно включить громкоговоритель, радио и телеприемник (в любое времясуток), прослушайте экстренное сообщение управления по делам ГО и ЧС.
После сигнала “Вниманиевсем!” может последовать и другая информация, например, об угрозе возникновенияЧС, о надвигающейся опасности радиоактивного или химического заражения,возникновения “Воздушной опасности”. В этих случаях будет передано краткоесообщение о порядке действий и правилах поведения при данной ЧС.
В рабочее время можнополучить информацию о передаче сигнала “Внимание всем!” от руководителейуниверситета (ГО и ЧС). Действовать необходимо согласно их указаниям.
Следует соблюдатьспокойствие и порядок. Необходимо быть внимательным к сообщениям работниковгражданской обороны./>4.2.6 Действия по видам сообщения при передачи сигнала«Внимание всем!»
При аварии с выбросом АХОВ и неблагоприятных метеоусловиях необходимо:
·         провестигерметизацию помещений;
·         отключить вентиляционныеустройства, электронагревательные приборы, перекрыть воду, газ;
·         подготовить ипроверить средства индивидуальной защиты органов дыхания и кожи, при ихотсутствии изготовить простейшие средства индивидуальной защиты;
·         взять с собойдокументы, деньги, продукты;
·         покинуть своеместонахождение и выйти по кратчайшему пути в направлении, указанном ГОЧС.
Все должны выйти вбезопасное место в кротчайшее время до подхода зараженного хлором воздушногооблака.
Если при аварии на любомиз химически опасных объектов района или на железной дороге и направлении ветрав сторону объекта или жилых домов получена информация о грозящей опасностипопадания в зону заражения АХОВ, то необходимо немедленно покинуть помещенияуниверситета, выйти из очага заражения и двигаться в направленииперпендикулярном движению ветра.
Время выхода из очагазаражения весьма ограничено и не должно превышать 15-20 минут с момента аварии,расстояние выхода около 200 – 300 метров. Выход осуществлять, дыша через смоченную в воде матерчатую повязку.
При возникновении“Воздушной опасности” (при военном положении) необходимо:
·         отключить свет,газ, воду;
·         взять средстваиндивидуальной защиты, документы, запас питания и воды;
·         помочь больномувыйти на улицу;
·         как можно быстреедойти до защитного сооружения или укрыться в складках местности.
При отбое действия посигналам ГО по указанию ГОЧС или представителя охраны общественного порядкавыйти из укрытий и возвратиться к месту работы. Снимать средства индивидуальнойзащиты – по особому распоряжению. В дальнейшем действовать по указаниюуправления ГОЧС или старшего на рабочем месте.
При других ЧС действоватьприменительно к случившейся ЧС./>4.2.7 Организация защиты сотрудников и студентов СибГИУ привозникновении ЧС мирного и военного времени
Инженерная защита:студенты и персонал университета укрываются в защитных сооружениях – подвальныхпомещениях корпусов, спорткомплексе, столовой.
Обеспечение средствамииндивидуальной защиты:
·         в экстренныхслучаях (при авариях с АХОВ) изготавливаются простейшие средства защиты органовдыхания (матерчатые повязки) из подручного материала, могут быть использованыпромышленные респираторы или ватно-марлевые повязки, имеющиеся на рабочемместе;
·         при поступлениираспоряжения управления ГО и ЧС на получение средств индивидуальной защиты(СИЗ) из запасов объекта (или централизованного) в помещениях главного корпуса,блока поточных аудиторий, горно-технологического корпуса разворачиваются“Пункты выдачи СИЗ”.
Выдача СИЗ осуществляетсяпоочередно для всех структурных подразделений по графику, составленному штабомГОЧС университета.
Организация эвакуацииуниверситета:
·         в мирное время(экстренная эвакуация):
o    при авариях напредприятиях города (района) или ж/д с выбросом АХОВ – в места, указанные приполучении сигнала “Внимание всем!” в направлении, перпендикулярном движениюзараженного облака (с учетом особенностей АХОВ);
o    при повышениирадиационного фона свыше 60 мкр/час – по распоряжению управления ГОЧС районаили руководителя объектов в места, определенные администрацией области;
·         в военное время(плановая эвакуация):
o    с получениемраспоряжения управления ГОЧС эвакуацию осуществляет эвакуационная комиссияуниверситета. Эвакуация работников и студентов СибГИУ и членов их семейосуществляется по железной дороге в населенный пункт г. Гурьевск Кемеровскойобласти в том числе: железнодорожным транспортом, через СЭП №20,разворачиваемый в помещении блока поточных аудиторий;
o    в загородныхзонах размещение происходит в помещениях 3-х автохозяйств и жилых домах(подселением) согласно плану управления ГОЧС.
/>4.3 Экологичность проекта
С точки зрения энергоснабжения мониторы, используемые в рабочем процессе,имеют встроенную систему экономии электроэнергии – PowerSaver. Эта система сохраняетэлектроэнергию посредством переключения монитора в режим с низким потреблениемэнергии, когда он не используется в течение определенного периода времени.
Возможные режимы работы – рабочий, Stand-by, Suspend, выключен. Данная система успешноработает с VESA DPMS – совместимой видеокартой, установленной вкомпьютере. Более детальная информация сведена в таблице 3.
Таблица 17 – Характеристики режимов сохранения электроэнергии [10].Состояние Рабочее Режим сохранения электроэнергии EPA/NUTEK Режим Stand-by Режим Suspend Режим Power-off Горизонтальная синхр. Активный Неактивный Активный Неактивный Вертикальная синхр. Активный Активный Неактивный Неактивный Видео Активный Темный экран Темный экран Темный экран Потребляемая мощность
73 Вт (макс)
55 Вт (номин) 50 Вт (номин) Менее 15 Вт Менее 5 Вт
Монитор автоматически возвращается к режиму нормального функционированияпри восстановлении горизонтальной и вертикальной развертки.

Заключение
В результате выполнения дипломного проекта главная задача, поставленная вразделе «Постановка задачи» – реализовать специализированное шахматноепрограммное обеспечение, отвечающее всем критериям и ограничениям – былавыполнена полностью.
Для решения поставленной задачи были использованы методологии разработкипрограммного обеспечения, детально рассмотренные в дипломном проекте, а такжестандартные средства программных продуктов, представленных в настоящей работе. Всвязи с невозможностью использования прототипов специализированного шахматногопрограммного обеспечения в ходе разработки были применены приемы экстремальнойметодологии разработки ПО.
По данным анализа результатов тестовых испытаний, представленных в приложении8, было выявлено полное соответствие реализованного специализированногошахматного программного обеспечения всем критериям и ограничениям.

Список использованныхисточников
1.                 Санитарные нормыи правила: СНиП 41.01-03. Отопление, вентиляция и кондиционирование. — Введен01.01 2004. Технорматив: информационная система. – 58 с.
2.                 Санитарныеправила и нормы: СанПиН 2.2.2/2.4.1340-03. Гигиенические требования кперсональным электронно-вычислительным машинам и организация работы. – Введен30.06.2003. Технорматив: информационная система – 26 с.
3.                 Системастандартов безопасности труда: ГОСТ 12.0.003-74. Опасные и вредные факторы. –Введен 18.11.1974. М.: — Госстандарт СССР, 1974г., — 55с.
4.                 Системастандартов безопасности труда: ГОСТ 12.005-88. Общие санитарно-гигиеническиетребования к воздуху рабочей зоны. – Введен 29.09.1988. М.: — Государственныйкомитет СССР по стандартам, 1988г. — 28с
5.                 Санитарныеправила и нормы: СанПиН 2.2.1/2.2.2.1278-03. Гигиенические требования кестественному, искусственному и совмещенному освещению жилых и общественныхзданий. – Введен 15.06.2003.Технорматив: информационная система. – 27 с.
6.                 Санитарные нормы:СН 2.2.4/2.1.8.562-96. Шум на рабочих местах, в помещениях жилых, общественныхзданий и на территории жилой застройки. – Введен 31.10.1996. М.: — ГоскомсанэпиднадзораРоссии, 1996г. — 34с.
7.                 Санитарныеправила и нормы: СанПиН 2.2.4.1191-03 Электромагнитные поля в производственныхусловиях — Введен 01.05.2003.СПб.: Минздрав РФ, 2003г. — 17 с.
8.                 Нормы пожарнойбезопасности: НПБ 105-2003. Определение категорий помещений, зданий и наружныхустановок по взрывопожарной и пожарной опасности. — Введен 18.06.2003. М.: МЧСРФ, 2003г. — 26с.
9.                 Санитарные нормыи правила: СНиП 21.01-97. Пожарная безопасность зданий и сооружений. — Введен01.01.1998. Технорматив: информационная система. – 23 с.
10.               Системастандартов безопасности труда: ГОСТ Р50949-96. Средства отображения информациииндивидуального пользования. Методы измерений и оценки эргономическихпараметров и параметров безопасности. – Введен 01.07.1997. М: ГосстандартРоссии, 1996 – 27 с.
11.               Фултон Х.Программирование на языке Ruby.Идеалогия языка, теория и практика приминения. / Х.Фултон – М.: ДМК-Пресс,2007. – 688 с.
12.               Томас Д. Гибкаяразработка веб-приложений в среде Rails. / Томас Д., Хэнссон Д.Х. – СПб.: Питер, 2008. – 716 с.
13.               Монахов В.В. Языкпрограммирования Java и среда NetBeans. / Монахов В.В. – СПб.:БХВ-Петербург, 2008. – 640 с.
14.               Шильдт Х. Java. Методики программирования Шилдта. /Шильдт Х. – М.: Вильямс, 2008. – 512 с.
15.               Гудман Д. JavaScript. Библия пользователя. Издание 5-е. /Гудман Д., Моррисон М. – М.: Вильямс, 2006. – 1184 с.
16.               Флэнаган Д. JavaScript. Подробное руководтство. Издание 4-е./ Флэнаган Д. – М.: Символ-плюс, 2004. – 960 с.
17.               Муссиано Ч. HTML и XHTML. Подробное руководство. Издание 6-е. / Муссиано Ч.,Кеннеди Б. – М.: Символ-плюс, 2008. – 752 с.
18.               Лазаро И.К.Полный справочник по HTML, CSS и JavaScript. Справочник профессионала. / ЛазароИ.К. – М.: Третий Рим, 2007. – 1168 с.
19.               Бобко Т.В.Методические указания к выполнению экономической части дипломных проектов. /Бобко Т.В. – Новокузнецк: СибГИУ, 2007. – 47 с.
20.               Бек К.Экстремальное программирование. / Бек К. – СПб.: Питер, 2002. -224с.
21.               Избачков Ю.С.Информационные системы: Учебник для вузов. 2-е издание. / Избачков Ю.С., ПетровВ.Н. – СПб.: Питер, 2005. – 656 с.
Приложение А
Календарный план работ посозданию системы№ Наименование этапа Сроки исполнения Исполнитель 1 Разработка ТЗ на ИС «Шахматный клуб» по пунктам 1,2
01.08.2007 –
01.09.2007 Ширяев А.С. 2 Разработка ТЗ на ИС «Шахматный клуб» по пунктам 3-5
 01.09.2007 –
 01.11.2007 Ширяев А.С. 3 Разработка ТЗ на ИС «Шахматный клуб» по пунктам 6-9
 01.11.2007 –
 01.12.2007 Ширяев А.С. 4 Закупка оборудования, создание системы, разработка необходимой документации на систему
 01.12.2007 –
 01.02.2008 Персонал шахматного клуба ГОУ ВПО «СибГИУ», персонал МУДОД «СДЮСШОР по шахматам им. Б. А. Кустова» 5 Предварительные испытания системы
 02.02.2008 –
 03.02.2008
Персонал шахматного клуба ГОУ ВПО «СибГИУ», персонал МУДОД «СДЮСШОР по шахматам им. Б. А. Кустова»,
Ширяев А.С. 6 Опытная эксплуатация
 03.02.2008 –
 03.03.2008 Персонал шахматного клуба ГОУ ВПО «СибГИУ», персонал МУДОД «СДЮСШОР по шахматам им. Б. А. Кустова»

Приложение Б
Комплектностьдокументации на системуНаименование документации
Документация по общесистемным решениям:
 Схема функциональной структуры
Описание автоматизируемых функций и функций по представлению информации
 Общее описание системы
Документация по организационному обеспечению:
Описание организационной структуры
Организационно-техническая инструкция
Документация по техническому обеспечению:
Описание комплекса технических средств
Структурная схема комплекса технических средств
Документация на технические средства
Документация по информационному обеспечению:
Перечень входных сигналов и данных
Перечень выходных сигналов и данных
Описание информационного обеспечения системы
Описание организации информационной базы
Документация по программному обеспечению:
Описание программного обеспечения
Документация на программное обеспечение

Приложение В
Листингпрограммы-транслятора шахматных партий
Контроллеры (controller)
main_controller.rb
---
# Основной контроллерпортала
classMainController
 
 # Редирект на главную страницу
 def index
 render:action => 'logo'
 end
 
 # Главная страница
 def logo
 end
 # Старая страница
 def main
 render:action => 'logo'
 end
 
 # Показ партий в онлайн режиме(трансляции)
 def online
 @online_games= CurrentGame.find :all
 end
 
 # Показ партий в оффлайнрежиме (уже закончившиеся)
 def offline
 
 end
 
 # Напоминание при потерепароля или логина
 def remind
 
 end
 
 # Вход в личный кабинетпользователя
 def enter
 unlesssession[:user_id].nil?
 redirect_to"/users/room/#{session[:user_id]}"
 end
 end
 
 # Показ трансляции
 def game
 unlessparams[:id].nil?
 @game =Game.find params[:id]
 else
 render:action => 'logo'
 end
 end
 
 # Возвращает текст партии вусловленном формате
 def game_moves
 @game =Game.find(params[:id])
 render_text@game.moves
 end
 # Авторизация
 def login
 session[:user_id]= nil
 user =User.authenticate(params[:login], params[:password])
 if user.nil?
 redirect_to:action => 'enter'
 else
 session[:user_id]= user.id
 redirect_to"/users/room/#{user.id}"
 end
 end
 
 # Выход пользователя
 def unlogin
 session[:user_id] = nil
 redirect_to:action => 'logo'
 end
 
 # Переход к регистрации
 def register
 redirect_to '/users/new'
 end
end
cities_controller.rb
---
classCitiesController
 layout 'main'
 scaffold:cities
end
clock_reglaments_controller.rb
---
classClockReglamentsController
 layout 'main'
 scaffold:clock_reglament
end
countries_controller.rb
---
classCountriesController
 layout 'main'
 scaffold:countries
end
game_infos_controller.rb
---
classGameInfosController
 layout 'main'
 scaffold :game_info
end
games_controller.rb
---
classGamesController
 layout 'main'
 scaffold:game
end
moves_controller.rb
---
classMovesController
 layout 'main'
 scaffold:move
end
players_controller.rb
---
classPlayersController
 layout 'main'
 scaffold:player
end
tournament_views_controller.rb
---
classTournamentViewsController
 layout 'main'
 scaffold:tournament_view
end
tournaments_controller.rb
---
classTournamentsController
 layout 'main'
 scaffold:tournament
 
 def index
 render:action => 'list'
 end
end
users_controller.rb
---
classUsersController
 layout 'main'
 scaffold:users
 
 def index
 render:action => 'room'
 end
 
 def room
 
 end
end
Помощники (helper)
main_helper.rb
---
moduleMainHelper
 
 defprint_current_tournament
 html =""
 Tournament.find_all_by_status('open').eachdo |tournament|
 city =tournament.city_id.nil?? nil: City.find(tournament.city_id)
 html "
 html "
 html " + tournament.name + ""
 html " + (city.nil?? "": city.name) +""
 html "
 end
 html
 end
 
 def render_game_info
 «Тестовая партия из тестовоготурнира»
 end
 
 defrender_moves
 moves =""
 moves =""
 moves +=""
 moves +="1.bcde"
 moves +="2.bcde"
 moves +="3.bcde"
 moves +="4.bcde"
 moves +="5.bcde"
 moves +="6.bcde"
 moves +="7.bcde"
 moves +="8.bcde"
 moves +="9.bcde"
 moves +="10.bcde"
 moves +="11.bcde"
 moves +="12.bcde"
 moves +="13.bcde"
 moves +="14.bcde"
 moves +="15.bcde"
 moves +="16.bcde"
 moves +="17.bcde"
 moves +="18.bcde"
 moves +="19.bcde"
 moves +="20.bcde"
 moves +=""
 moves +=image_tag('go_begin.jpg', :id => 'go_begin', :onclick => 'goBegin();'),:onmouseover => 'new Effect.Scale(«go_begin», 110)'), :onmouseout=> 'new Effect.Scale(«go_begin», 90)') + ' '
 moves +=image_tag('go_prev.jpg', :id => 'go_prev', :onclick => 'goPrev();'):onmouseover => 'new Effect.Scale(«go_prev», 110)', :onmouseout=> 'new Effect.Scale(«go_prev», 90)') + ' '
 moves +=image_tag('go_refresh.jpg', :id => 'go_refresh', :onclick =>'goRefresh();') :onmouseover => 'new Effect.Scale(«go_refresh»,110)', :onmouseout => 'new Effect.Scale(«go_refresh», 90)') +' '
 moves +=image_tag('go_next.jpg', :id => 'go_next', :onclick =>'goNext();'):onmouseover => 'new Effect.Scale(«go_next», 110)',:onmouseout => 'new Effect.Scale(«go_next», 90)') + ' '
 moves +=image_tag('go_end.jpg', :id => 'go_end', :onclick =>'goEnd();')#:onmouseover => 'new Effect.Scale(«go_end», 110)',:onmouseout => 'new Effect.Scale(«go_end», 90)') + ' '
 moves +=""
 moves +="";
 moves
 end
 
 defrender_board
 return"
 
 8
 
 
 
 
 
 
 
 
 
 
 7
 
 
 
 
 
 
 
 
 
 
 6
 
 
 
 
 
 
 
 
 
 
 5
 
 
 
 
 
 
 
 
 
 
 4
 
 
 
 
 
 
 
 
 
 
 3
 
 
 
 
 
 
 
 
 
 
 2
 
 
 
 
 
 
 
 
 
 
 1
 
 
 
 
 
 
 
 
 
 
  
 A
 B
 C
 D
 E
 F
 G
 H
 
 "
 end
 defrender_result
 «1/2 — 1/2»
 end
 
 defrender_black_time
 "-:--:--"
 end
 
 defrender_white_time
 "-:--:--"
 end
end
Представление (view)
layout/main.rhtml
---

«www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd»>

 
 
 Стартоваястраница:
 
 
 
 
 
 
 
 
 
 
 
  '42x25', :border => 0, :alt =>'http://dgtprojects.com'), 'http://dgtprojects.com')%>   
 Сервертрансляции шахматных партий    
  '12x12', :border => 0),'/main/index') %>
  '12x12', :border => 0), '') %>
  '12x12', :border => 0), '')%>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  
 
 
 
 
 

main/enter.rhtml
---

 
 
 Имя: 
 
 
 
 Пароль: 
 
 
 
 
 
 
  'register' }%>
 
 
  'remind' }%>
 
 


main/game.rhtml
---




 
 
  '16x16' %>
 
  'players', :action =>'show', :id => @game.black_player.id } %>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  '16x16' %>
 
  'players', :action =>'show', :id => @game.white_player.id} %>
 
 
 
 
 
 
 
 
 
 
 
 

'moves', :url => { :action =>'game_moves', :id => @game.id } %>

main/logo.rhtml
---

'Шахматный портал rDGT', :width => '400px',:height => '280px' %>

'online' }%>
'offline' }%>
'enter' } %>

main/online.rhtml
---
'game' }%>-->

 
 
 Начало
 Турнир
 Белые
 Черные
 
 
 
  '16x16',:onclick => '', :alt => 'Просмотр трансляции'), { :action => 'game',:id => game.id }) %>
 
 'tournaments', :action => 'show', :id => game.tournament.id }%>
 'players', :action => 'show', :id => game.white.id } %>
 'players', :action => 'show', :id => game.black.id } %>
 
 

Модель (model)
---
class Cities
end
class City
end
classClockReglament
end
class Country
end
classCurrentGame
 def init
 @game =Game.find(self.game_id) if @game.nil?
 end
 
 deftournament
 init
 @game.tournament
 end
 
 def white
 init
 @game.white_player
 end
 
 def black
 init
 @game.black_player
 end
end
class Game
 def moves
 result =""
 @moves =Move.find_all_by_game_id self.id
 @moves.sort {|movea, moveb| movea.number moveb.number }.each do |move|
 result +=move.to_s + "|"
 end
 result
 end
 deftournament
 info =GameInfo.find self.game_info_id unless self.game_info_id.nil?
 t =Tournament.find info.tournament_id
 end
 
 defwhite_player
 player =Player.new
 player.id= 1
 player.first_name= «Иван»
 player.second_name= «Рыков»
 player
 end
 
 defblack_player
 player =Player.new
 player.id= 1
 player.first_name= «Сергей»
 player.second_name= «Бедарев»
 player
 end
end
class GameInfo
end
class LastMove
end
class Move
 
 def to_s
 ((self.white_move.nil?or self.white_move == "")? "******": self.white_move) +
 ((self.black_move.nil?or self.black_move == "")? "******": self.black_move) +":" +
 (self.white_clock.nil?? "": self.white_clock) + "-" + (self.black_clock.nil??"": self.black_clock)
 end
end
class Player
 
 def full_name
 returnself.second_name + " " + self.first_name
 end
 
 def to_s
 full_name
 end
end
classTournament
 
 def to_s
 self.name
 end
end
classTournamentView
end
require'digest/md5'
class User
 validates_presence_of:login
 validates_uniqueness_of:login
 
 defself.authenticate(login, password)
 user =User.find_by_name(login)
 if user
 expected_password= encrypted_password(password)
 ifuser.password != expected_password
 user = nil
 end
 end
 user
 end
 
 defself.encrypted_password(password)
 Digest::MD5.hexdigest(«sdjkvkjeho2ijij2o3d2kn3dl2kn3dn23dkn2ld3n»+ password)
 end
end
Миграция (db migration)
---
ActiveRecord::Schema.define(:version=> 12) do
 create_table«cities», :force => true do |t|
 t.column«name», :string, :limit => 30
 t.column«country_id», :integer
 t.column«description», :text
 t.column«image», :binary
 end
 create_table«clock_reglaments», :force => true do |t|
 t.column«title», :string, :limit => 30
 t.column«total_time», :integer
 t.column«add», :boolean, :limit => nil, :default => false
 t.column«add_time», :integer, :default => 0
 t.column«desciprion», :text
 end
 create_table«countries», :force => true do |t|
 t.column«name», :string, :limit => 30
 t.column«code», :string, :limit => 30
 t.column«image», :binary
 t.column«description», :text
 end
 create_table«current_games», :force => true do |t|
 t.column«game_id», :integer
 t.column«begin», :datetime
 t.column«end», :datetime
 t.column«description», :text
 end
 create_table«game_infos», :force => true do |t|
 t.column«game_id», :integer
 t.column«white_id», :integer
 t.column«black_id», :integer
 t.column«tournament_id», :integer
 t.column«result», :integer
 t.column«clock_reglament_id», :integer
 t.column«round», :integer
 t.column«debut_code», :string, :limit => 30
 t.column«description», :text
 t.column«status», :string, :limit => 30
 end
 create_table«games», :force => true do |t|
 t.column«game_info_id», :integer
 t.column«begin», :datetime
 t.column«end», :datetime
 t.column«desciption», :text
 end
 create_table«last_moves», :force => true do |t|
 t.column«move_id», :integer
 t.column«move_time», :datetime
 end
 create_table«moves», :force => true do |t|
 t.column«number», :integer
 t.column«game_id», :integer
 t.column«white_move», :string, :limit => 6
 t.column«black_move», :string, :limit => 6
 t.column«white_clock», :float
 t.column«black_clock», :float
 t.column«white_comment», :text
 t.column«black_comment», :text
 end
 create_table«players», :force => true do |t|
 t.column«first_name», :string, :limit => 30
 t.column«second_name», :string, :limit => 30
 t.column«country_id», :integer
 t.column«burn_date», :datetime
 t.column«fide_rating», :integer
 t.column«photo», :binary
 t.column«description», :text
 end
 create_table«tournament_views», :force => true do |t|
 t.column«name», :string, :limit => 30
 t.column«system», :string, :limit => 30
 t.column«is_match», :boolean, :limit => nil, :default => false
 t.column«is_command», :boolean, :limit => nil, :default => false
 t.column«total_games», :integer, :default => 0
 t.column«total_rounds», :integer, :default => 0
 t.column«description», :text
 end
 create_table«tournaments», :force => true do |t|
 t.column«name», :string, :limit => 30
 t.column«category», :integer
 t.column«city_id», :integer
 t.column«begin_date», :datetime
 t.column«end_date», :datetime
 t.column«tournament_view_id», :integer
 t.column«status», :string, :limit => 30
 t.column«description», :text
 end
 create_table«users», :force => true do |t|
 t.column«login», :string, :limit => 30
 t.column«password», :string, :limit => 50
 t.column«name», :string, :limit => 30
 t.column«is_admin», :boolean, :limit => nil, :default => false
 t.column«email», :string, :limit => 30
 t.column«webpage», :string, :limit => 30
 t.column«desciption», :text
 end
end
Javascript (javascript) – осуществляют демонстрациюшахматной партии, при помощи технологии AJAX обращаясь за обновлениями позиции на rDGT сервер.
game.js
---
var images ='http://localhost:3000/images/classic/';
var moves_url= '/main/game_moves/1';
// Фигура
functionfigure(id, color, type, current_field, last_field, alive, board) {
 this.id = id;
 this.color =color;
 this.type =type;
 this.current_field= current_field;
 this.last_field= last_field;
 this.alive =alive;
 this.set_field= set_field;
 this.do_move= do_move;
 this.reload =reload;
 this.img =document.createElement('img');
 this.img.id =this.id;
 this.board =board;
 
 this.reload();
 //trace('createfigure [' + this.id + ']');
}
// Поле
functionfield(id, color, vertical, horizontal, figure, board) {
 this.id = id;
 this.color =color;
 this.vertical= vertical;
 this.horizontal= horizontal;
 this.figure =figure;
 this.board =board;
 this.repaint= repaint;
 
 //trace('createfield [' + this.id + ']');
}
// Ход
functionmove(number, color, from_field, to_field, figure, alive_figure,is_short_castling, is_long_castling, prev_move, next_move, board, time) {
 this.number =number;
 this.color =color;
 this.from_field= from_field;
 this.to_field= to_field;
 this.figure =figure;
 this.alive_figure= alive_figure;
 this.forward= forward;
 this.backward= backward;
 this.is_short_castling= is_short_castling;
 this.is_long_castling= is_long_castling;
 this.prev_move= prev_move;
 this.next_move= next_move;
 this.board =board;
 this.white_time= white_time;
 this.black_time= black_time;
}
// Коллекцияходов
functionmove_collection(board) {
 this.board =board;
 this.get_move= function(color, number) {
 return color== 'white'? this.moves[(number * 2) — 1]: this.moves[number * 2];
 }
 this.exists_move= function(color, number) {
 returnget_move(color, number) != null;
 }
 this.get_current_move= function() {
 returnthis.current_move;
 }
 this.add_move= function(move) {
 trace('addmove: ' + move.number + " " + moveBy.color);
 if(current_move== null) {
 this.first_move= move;
 this.current_move= move;
 } else {
 move.prev_move= this.current_move;
 this.current_move.next_move= move;
 this.current_move= move;
 }
 this.moves.push(move);
}
this.first_move= null;
this.current_move= null;
this.moves =new Array();
}
// Коллекцияфигур
functionfigure_collection(board) {
 this.board =board;
 
 this.wpA =new figure('wpA', 'white', 'pawn', null, null, true, board);
 this.wpB =new figure('wpB', 'white', 'pawn', null, null, true, board);
 this.wpC =new figure('wpC', 'white', 'pawn', null, null, true, board);
 this.wpD =new figure('wpD', 'white', 'pawn', null, null, true, board);
 this.wpE =new figure('wpE', 'white', 'pawn', null, null, true, board);
 this.wpF =new figure('wpF', 'white', 'pawn', null, null, true, board);
 this.wpG =new figure('wpG', 'white', 'pawn', null, null, true, board);
 this.wpH =new figure('wpH', 'white', 'pawn', null, null, true, board);
 this.wrA =new figure('wrA', 'white', 'rook', null, null, true, board);
 this.wrH =new figure('wrH', 'white', 'rook', null, null, true, board);
 this.whB =new figure('whB', 'white', 'horse', null, null, true, board);
 this.whG =new figure('whG', 'white', 'horse', null, null, true, board);
 this.wbC =new figure('wbC', 'white', 'bishop', null, null, true, board);
 this.wbF =new figure('wbF', 'white', 'bishop', null, null, true, board);
 this.wq = newfigure('wq', 'white', 'queen', null, null, true, board);
 this.wk = newfigure('wk', 'white', 'king', null, null, true, board);
 
 this.bpA =new figure('bpA', 'black', 'pawn', null, null, true, board);
 this.bpB =new figure('bpB', 'black', 'pawn', null, null, true, board);
 this.bpC =new figure('bpC', 'black', 'pawn', null, null, true, board);
 this.bpD =new figure('bpD', 'black', 'pawn', null, null, true, board);
 this.bpE =new figure('bpE', 'black', 'pawn', null, null, true, board);
 this.bpF =new figure('bpF', 'black', 'pawn', null, null, true, board);
 this.bpG =new figure('bpG', 'black', 'pawn', null, null, true, board);
 this.bpH =new figure('bpH', 'black', 'pawn', null, null, true, board);
 this.brA =new figure('brA', 'black', 'rook', null, null, true, board);
 this.brH =new figure('brH', 'black', 'rook', null, null, true, board);
 this.bhB =new figure('bhB', 'black', 'horse', null, null, true, board);
 this.bhG =new figure('bhG', 'black', 'horse', null, null, true, board);
 this.bbC =new figure('bbC', 'black', 'bishop', null, null, true, board);
 this.bbF =new figure('bbF', 'black', 'bishop', null, null, true, board);
 this.bq = newfigure('bq', 'black', 'queen', null, null, true, board);
 this.bk = newfigure('bk', 'black', 'king', null, null, true, board);
}
// Коллекцияполей шахматной доски
functionfield_collection(board) {
 this.get_field= get_field;
 this.board =board;
 this.toArray= function() {
 return[this.A1, this.A2, this.A3, this.A4, this.A5, this.A6, this.A7, this.A8,
 this.B1,this.B2, this.B3, this.B4, this.B5, this.B6, this.B7, this.B8,
 this.C1,this.C2, this.C3, this.C4, this.C5, this.C6, this.C7, this.C8,
 this.D1,this.D2, this.D3, this.D4, this.D5, this.D6, this.D7, this.D8,
 this.E1,this.E2, this.E3, this.E4, this.E5, this.E6, this.E7, this.E8,
 this.F1,this.F2, this.F3, this.F4, this.F5, this.F6, this.F7, this.F8,
 this.G1,this.G2, this.G3, this.G4, this.G5, this.G6, this.G7, this.G8,
 this.H1,this.H2, this.H3, this.H4, this.H5, this.H6, this.H7, this.H8];
 }
 
 this.A1 = newfield('fieldA1', 'black', 'A', '1', null, board);
 this.B1 = newfield('fieldB1', 'white', 'B', '1', null, board);
 this.C1 = newfield('fieldC1', 'black', 'C', '1', null, board);
 this.D1 = newfield('fieldD1', 'white', 'D', '1', null, board);
 this.E1 = newfield('fieldE1', 'black', 'E', '1', null, board);
 this.F1 = newfield('fieldF1', 'white', 'F', '1', null, board);
 this.G1 = newfield('fieldG1', 'black', 'G', '1', null, board);
 this.H1 = newfield('fieldH1', 'white', 'H', '1', null, board);
 
 this.A2 = newfield('fieldA2', 'white', 'A', '2', null, board);
 this.B2 = newfield('fieldB2', 'black', 'B', '2', null, board);
 this.C2 = newfield('fieldC2', 'white', 'C', '2', null, board);
 this.D2 = newfield('fieldD2', 'black', 'D', '2', null, board);
 this.E2 = newfield('fieldE2', 'white', 'E', '2', null, board);
 this.F2 = newfield('fieldF2', 'black', 'F', '2', null, board);
 this.G2 = newfield('fieldG2', 'white', 'G', '2', null, board);
 this.H2 = newfield('fieldH2', 'black', 'H', '2', null, board);
 
 this.A3 = newfield('fieldA3', 'black', 'A', '3', null, board);
 this.B3 = newfield('fieldB3', 'white', 'B', '3', null, board);
 this.C3 = newfield('fieldC3', 'black', 'C', '3', null, board);
 this.D3 = newfield('fieldD3', 'white', 'D', '3', null, board);
 this.E3 = newfield('fieldE3', 'black', 'E', '3', null, board);
 this.F3 = newfield('fieldF3', 'white', 'F', '3', null, board);
 this.G3 = newfield('fieldG3', 'black', 'G', '3', null, board);
 this.H3 = newfield('fieldH3', 'white', 'H', '3', null, board);
 
 this.A4 = newfield('fieldA4', 'white', 'A', '4', null, board);
 this.B4 = newfield('fieldA4', 'black', 'B', '4', null, board);
 this.C4 = newfield('fieldC4', 'white', 'C', '4', null, board);
 this.D4 = newfield('fieldD4', 'black', 'D', '4', null, board);
 this.E4 = newfield('fieldE4', 'white', 'E', '4', null, board);
 this.F4 = newfield('fieldF4', 'black', 'F', '4', null, board);
 this.G4 = newfield('fieldG4', 'white', 'G', '4', null, board);
 this.H4 = newfield('fieldH4', 'black', 'H', '4', null, board);
 
 this.A5 = newfield('fieldA5', 'black', 'A', '5', null, board);
 this.B5 = newfield('fieldB5', 'white', 'B', '5', null, board);
 this.C5 = newfield('fieldC5', 'black', 'C', '5', null, board);
 this.D5 = newfield('fieldD5', 'white', 'D', '5', null, board);
 this.E5 = newfield('fieldE5', 'black', 'E', '5', null, board);
 this.F5 = newfield('fieldF5', 'white', 'F', '5', null, board);
 this.G5 = newfield('fieldG5', 'black', 'G', '5', null, board);
 this.H5 = newfield('fieldH5', 'white', 'H', '5', null, board);
 
 this.A6 = newfield('fieldA6', 'white', 'A', '6', null, board);
 this.B6 = newfield('fieldB6', 'black', 'B', '6', null, board);
 this.C6 = newfield('fieldC6', 'white', 'C', '6', null, board);
 this.D6 = newfield('fieldD6', 'black', 'D', '6', null, board);
 this.E6 = newfield('fieldE6', 'white', 'E', '6', null, board);
 this.F6 = newfield('fieldF6', 'black', 'F', '6', null, board);
 this.G6 = newfield('fieldG6', 'white', 'G', '6', null, board);
 this.H6 = newfield('fieldH6', 'black', 'H', '6', null, board);
 
 this.A7 = newfield('fieldA7', 'black', 'A', '7', null, board);
 this.B7 = newfield('fieldB7', 'white', 'B', '7', null, board);
 this.C7 = newfield('fieldC7', 'black', 'C', '7', null, board);
 this.D7 = newfield('fieldD7', 'white', 'D', '7', null, board);
 this.E7 = newfield('fieldE7', 'black', 'E', '7', null, board);
 this.F7 = newfield('fieldF7', 'white', 'F', '7', null, board);
 this.G7 = newfield('fieldG7', 'black', 'G', '7', null, board);
 this.H7 = newfield('fieldH7', 'white', 'H', '7', null, board);
 
 this.A8 = newfield('fieldA8', 'white', 'A', '8', null, board);
 this.B8 = newfield('fieldB8', 'black', 'B', '8', null, board);
 this.C8 = newfield('fieldC8', 'white', 'C', '8', null, board);
 this.D8 = newfield('fieldD8', 'black', 'D', '8', null, board);
 this.E8 = newfield('fieldE8', 'white', 'E', '8', null, board);
 this.F8 = newfield('fieldF8', 'black', 'F', '8', null, board);
 this.G8 = newfield('fieldG8', 'white', 'G', '8', null, board);
 this.H8 = newfield('fieldH8', 'black', 'H', '8', null, board);
}
functionboard() {
 this.moves =new move_collection(this);
 this.figures= new figure_collection(this);
 this.fields =new field_collection(this);
 this.init =init;
 this.last_move= null;
 // Обновляетпозицию
 this.refresh_moves= function() {
 // Ajax запрос к серверу
 newAjax.Request(moves_url, {
 method:'get',
 onSuccess:function(transport) {
 all_moves =transport.responseText;
 trace('ajax: ' + all_moves);
 }
 });
 
 trace('call=> parse_moves(' + all_moves + ')')
 
 functionexistsWhite(move) {
 returngetWhiteMove(move) != "******";
 }
 functionexistsBlack(move) {
 returngetBlackMove(move) != "******";
 }
 functiongetWhiteMove(move) {
 returnmove.substring(0,6);
 }
 functiongetWhiteTime(move) {
 returnmove.substring(13, 19);
 }
 functiongetBlackMove(move) {
 returnmove.substring(6,12);
 }
 functiongetBlackTime(move) {
 returnmove.substring(20, 26);
 }
 functiongetFrom(color, move) {
 }
 functiongetTo(color, move) {
 }
 functionisShortCastling(color, move) {
 }
 functionisLongCastling(color, move) {
 }
 
 moves_split =all_moves.split('|');
 moves_strip =new Array();
 for(i = 0; i
 if(moves_split[i]!= "") {
 moves_strip.push(moves_split[i]);
 trace('split:' + moves_split[i]);
 }
 }
 
 var number =moves_strip.length;
 trace('number= ' + number);
 varcurrent_move = this.moves.get_current_move();
 trace('current_move= ' + current_move);
 varcurrent_number = current_move != null? current_move.number: 0;
 trace('current_number= ' + current_number);
 
 if(number ==current_number) {
 if((current_move.color== 'white') && existsBlack(moves_strip[number — 1])) {
 varmove_annotation = getBlackMove(moves_strip[number — 1]);
 var move_time= getBlackTime(moves_strip[number — 1]);
 var fieldFrom= getFrom('black', move_annotation);
 var fieldTo =getTo('black', move_annotation);
 var move =new move(number, 'black', fieldFrom, fieldTo, fieldFrom.figure, fieldTo.figure,isShortCastling('black', move_annotation), isLongCastling('black',move_annotation), current_move, null, this, move_time);
 this.moves.add_move(move);
 }
 }
 
 if(number> current_number){
 for(iMove =current_move; iMove
 varmove_annotation = getWhiteMove(moves_strip[number — 1]);
 if(existsWhite(move_annotation)){
 var move_time= getWhiteTime(moves_strip[number — 1]);
 var fieldFrom= getFrom('white', move_annotation);
 var fieldTo =getTo('white', move_annotation);
 var move =new move(iMove + 1, 'white', fieldFrom, fieldTo, fieldFrom.figure,fieldTo.figure, isShortCastling('white', move_annotation),isLongCastling('white', move_annotation), current_move, null, this, move_time);
 this.moves.add_move(move);
 }
 
 move_annotation= getBlackMove(moves_strip[number — 1]);
 if(existsBlack(move_annotation)){
 var move_time= getBlackTime(moves_strip[number — 1]);
 var fieldFrom= getFrom('black', move_annotation);
 var fieldTo =getTo('black', move_annotation);
 var move =new move(iMove + 1, 'black', fieldFrom, fieldTo, fieldFrom.figure,fieldTo.figure, isShortCastling('black', move_annotation),isLongCastling('black', move_annotation), current_move, null, this, move_time);
 this.moves.add_move(move);
 }
 }
 }
 }
 this.refresh_figures= refresh_figures;
 this.go_begin= go_begin;
 this.go_end =go_end;
 this.go_next= go_next;
 this.go_preview= go_preview;
 this.go_custom= go_custom;
 this.repaint = function() {
 }
 
 // Парсит данныепришедшие от сервера
 this.parse_moves = function() {
 var moves =this.all_moves;
 trace('call=> parse_moves(' + moves + ')')
 
 functionexistsWhite(move) {
 returngetWhiteMove(move) != "******";
 }
 functionexistsBlack(move) {
 returngetBlackMove(move) != "******";
 }
 functiongetWhiteMove(move) {
 returnmove.substring(0,6);
 }
 functiongetWhiteTime(move) {
 returnmove.substring(13, 19);
 }
 functiongetBlackMove(move) {
 returnmove.substring(6,12);
 }
 functiongetBlackTime(move) {
 returnmove.substring(20, 26);
 }
 functiongetFrom(color, move) {
 }
 functiongetTo(color, move) {
 }
 functionisShortCastling(color, move) {
 }
 functionisLongCastling(color, move) {
 }
 
 moves_split =moves.split('|');
 moves_strip =new Array();
 for(i = 0; i
 if(moves_split[i]!= null) {
 moves_strip.push(moves_split[i]);
 }
 }
 
 var number =moves_strip.length;
 varcurrent_move = this.moves.get_current_move;
 varcurrent_number = current_move != null? current_move.number: 0;
 if(number ==current_number) {
 if((current_move.color== 'white') && existsBlack(moves_strip[number — 1])) {
 varmove_annotation = getBlackMove(moves_strip[number — 1]);
 var move_time= getBlackTime(moves_strip[number — 1]);
 var fieldFrom= getFrom('black', move_annotation);
 var fieldTo =getTo('black', move_annotation);
 var move =new move(number, 'black', fieldFrom, fieldTo, fieldFrom.figure, fieldTo.figure,isShortCastling('black', move_annotation), isLongCastling('black',move_annotation), current_move, null, this, move_time);
 this.moves.add_move(move);
 }
 }
 
 if(number> current_number){
 for(iMove =current_move; iMove
 varmove_annotation = getWhiteMove(moves_strip[number — 1]);
 if(existsWhite(move_annotation)){
 var move_time= getWhiteTime(moves_strip[number — 1]);
 var fieldFrom= getFrom('white', move_annotation);
 var fieldTo =getTo('white', move_annotation);
 var move =new move(iMove + 1, 'white', fieldFrom, fieldTo, fieldFrom.figure, fieldTo.figure,isShortCastling('white', move_annotation), isLongCastling('white',move_annotation), current_move, null, this, move_time);
 this.moves.add_move(move);
 }
 
 move_annotation= getBlackMove(moves_strip[number — 1]);
 if(existsBlack(move_annotation)){
 var move_time= getBlackTime(moves_strip[number — 1]);
 var fieldFrom= getFrom('black', move_annotation);
 var fieldTo =getTo('black', move_annotation);
 var move =new move(iMove + 1, 'black', fieldFrom, fieldTo, fieldFrom.figure,fieldTo.figure, isShortCastling('black', move_annotation),isLongCastling('black', move_annotation), current_move, null, this, move_time);
 this.moves.add_move(move);
 }
 }
 }
 }
 
 // Настройки
 this.all_moves= "";
 this.moves_delay= 3;
 this.moves_url= '/main/game_moves/1';
 this.figures_delay= 2;
}
//Инициализация доски
functioninit() {
 trace('call=> init()');
 // Расставляем шахматы в начальнуюпозицию
 // белые пешки
 this.figures.wpA.set_field(this.fields.A2);
 this.figures.wpB.set_field(this.fields.B2);
 this.figures.wpC.set_field(this.fields.C2);
 this.figures.wpD.set_field(this.fields.D2);
 this.figures.wpE.set_field(this.fields.E2);
 this.figures.wpF.set_field(this.fields.F2);
 this.figures.wpG.set_field(this.fields.G2);
 this.figures.wpH.set_field(this.fields.H2);
 // белыефигуры
 this.figures.wrA.set_field(this.fields.A1);
 this.figures.wrH.set_field(this.fields.H1);
 this.figures.whB.set_field(this.fields.B1);
 this.figures.whG.set_field(this.fields.G1);
 this.figures.wbC.set_field(this.fields.C1);
 this.figures.wbF.set_field(this.fields.F1);
 this.figures.wq.set_field(this.fields.D1);
 this.figures.wk.set_field(this.fields.E1);
 // черныепешки
 this.figures.bpA.set_field(this.fields.A7);
 this.figures.bpB.set_field(this.fields.B7);
 this.figures.bpC.set_field(this.fields.C7);
 this.figures.bpD.set_field(this.fields.D7);
 this.figures.bpE.set_field(this.fields.E7);
 this.figures.bpF.set_field(this.fields.F7);
 this.figures.bpG.set_field(this.fields.G7);
 this.figures.bpH.set_field(this.fields.H7);
 // черныефигуры
 this.figures.brA.set_field(this.fields.A8);
 this.figures.brH.set_field(this.fields.H8);
 this.figures.bhB.set_field(this.fields.B8);
 this.figures.bhG.set_field(this.fields.G8);
 this.figures.bbC.set_field(this.fields.C8);
 this.figures.bbF.set_field(this.fields.F8);
 this.figures.bq.set_field(this.fields.D8);
 this.figures.bk.set_field(this.fields.E8);
 // Создаем Ajax опрашиватель сервера
 newPeriodicalExecuter(this.refresh_moves, this.moves_delay);
 newPeriodicalExecuter(this.refresh_figures, this.figures_delay);
}
// Перерисовка позиции(делает один ход)
functionrefresh_figures() {
 //trace('call=> refresh_figures');
 
 if(this.exists_move){
 this.current_move= this.moves.get_current_move();
 this.current_move.forward();
 }
}
// Перейти кначалу
functiongo_begin() {
}
// Перейти кконцу
functiongo_end() {
}
// Следующийход
functiongo_next() {
}
// Предыдущийход
functiongo_preview() {
}
// Перейти кпроизвольному ходу
functiongo_custom(number, color) {
}
// сделать ход
functiondo_move(from_field, to_field) {
 }
// Возвращаетполе
functionget_field(vertical, horizontal) {
}
// Установитьфигуру на поле
functionset_field(field_to_set) {
 this.last_field= field_to_set;
 field_to_set.figure= this;
 field_to_set.repaint();
}
// Возвращает ход пономеру и цвету
functionget_move(number, color) {
 
}
// Возвращаеттекуший ход
functionget_current_move() {
 return this.current_move;
}
// Возвращает true если есть ход который нужносовершить
functionexists_move() {
}
functionrepaint() {
 $(this.id).innerHTML= '';
 if(this.figure!= null) {
 $(this.id).appendChild(this.figure.img);
 }
}
functionreload() {
 this.img.src= images + this.color[0] + this.type[0] + '.gif';
 //trace('reloadfigure [' + this.id + '].src = \"' + this.img.src + '\"');
}
// Ход вперед!!!предыдущую фигуру удалить
function forward(){
 if(this.to_field.figure != null) {
 }
 this.figure.do_move(this.from_field,this.to_field);
}
// Ход назад
functionbackward() {
 this.figure.do_move(this.to_field,this.from_field);
 this.alive_figure.set_field(this.to_field);
}
functiontrace(message) {
 $(«debug»).innerHTML+= message + '';
}
window.onload=function(){
 // Запуск
 varmain_board = new board();
 main_board.init();
 // setBeginingPosition();
 // refreshGame();
 // newPeriodicalExecuter(refreshGame, periodicalDelay);
 // newPeriodicalExecuter(refreshBoard, 1);
}

Приложение Г
Листингпрограммы-регистратора шахматных партий
rdgtChess.java
---
public classrdgtChess implements Runnable
static booleandebug = false;
String comport= «COM1»;
public staticvoid main(String[] args) {
rdgtChess t;
if(args.length> 0)
 t = newrdgtChess(args[0]);
 else
 t = newrdgtChess();
}
publicrdgtChess() {
(newThread(this)).start();
}
publicrdgtChess(String comport) {
this.comport =comport;
(newThread(this)).start();
}
// Destructor
public voidfinalize()
{
rdgtMysql.disconnect();
}
// This is themain loop. It samples all boards and tries at regular intervals
// to find newboards and to mark non-answering boards as, well, non-answering.
 Это головная часть. Она опрашиваетвсе доски с регулярным интервалом времени,
 чтобы найти новые доскии отметить неотвечающие доски как неотвечающие
public voidrun() {
rdgtControllerc = new rdgtController();
if(c.connect(comport) == false) return;
 System.out.println(rdgtMysql.connect());
int i = 0;
while (true) {
if ((i==0) ||(c.db.count_alive()==0)) {
while(c.find_all_boards()==0) {} c.dump_all_active_boards();
i = 15;
} else {
try{Thread.sleep(1000);} catch(Throwable t) {}}
c.poll_all_active_boards();
i--;
}
}
}
rdgtChessboard.java
---
classrdgtChessboard {
 Integeraddress;
 rdgtHistoryhistory = new rdgtHistory(this);
 rdgtSnapshotsnapshot = new rdgtSnapshot(this);
 rdgtFenhaxmyFenhax = new rdgtFenhax();
 booleanalive;
 booleandumped;
 booleanupdated;
 rdgtDatabasedb;
 rdgtChessBoardFormboard = null;
 
 publicrdgtChessboard(Integer _address, rdgtDatabase _db) {
 address =_address;
 db = _db;
 alive = true;
 dumped =false;
 updated =false;
 update_html();
 board = newrdgtChessBoardForm();
 
 newThread(new Runnable() {
 public voidrun() {
 board.setVisible(true);
 }
 }).start();
 }
 rdgtSnapshotget_snapshot() {
 returnsnapshot;
 }
 intget_address() {
 returnaddress.intValue();
 }
 public voidprint_position() {
 board.printPosition(snapshot.debugprint());
 board.printClock(snapshot.debugprint_clock());
 }
 
 Stringprint_figure(int figure) {
 if(figure ==rdgtProtocol.EMPTY) {
 return "";
 } else if(figure == rdgtProtocol.WPAWN) {
 return«P»;
 } elseif(figure == rdgtProtocol.WROOK) {
 return«R»;
 } elseif(figure == rdgtProtocol.WKNIGHT) {
 return«N»;
 } elseif(figure == rdgtProtocol.WBISHOP) {
 return«B»;
 } elseif(figure == rdgtProtocol.WQUEEN) {
 return«Q»;
 } elseif(figure == rdgtProtocol.WKING) {
 return«K»;
 } else if(figure == rdgtProtocol.BPAWN) {
 return«p»;
 } elseif(figure == rdgtProtocol.BROOK) {
 return«r»;
 } elseif(figure == rdgtProtocol.BKNIGHT) {
 return«n»;
 } elseif(figure == rdgtProtocol.BBISHOP) {
 return«b»;
 } elseif(figure == rdgtProtocol.BQUEEN) {
 return«q»;
 } elseif(figure == rdgtProtocol.BKING) {
 return«k»;
 } else {
 return "";
 }
 }
 voidset_alive(boolean x) {
 alive = x;
 update_html();
 }
 voidset_dumped(boolean x) {
 dumped = x;
 }
 void set_updated(booleanx) {
 updated = x;
 history.append(snapshot);
 }
 booleanget_alive() {
 return alive;
 }
 booleanget_dumped() {
 returndumped;
 }
 booleanget_updated() {
 returnupdated;
 }
 voidset_clockdata(boolean running, boolean batteryLow, booleanfrontViewLeftSideHigh, boolean blacksTurn, boolean whitesTurn, int secW, intsecB) {
 snapshot.set_clockdata(running,batteryLow, frontViewLeftSideHigh, blacksTurn, whitesTurn, secW, secB);
 snapshot.debugprint_clock();
 }
 voidupdate_html() {
 rdgtMysql.update_snapshot(snapshot);
 String fen =rdgtMysql.snapshot2fen(snapshot);
 myFenhax.add(fen);
 rdgtMysql.update_moves(rdgtFenhax.getMoves(true,false), rdgtFenhax.getMoves(true, true), address.intValue());
}
 voidset_emptyboard() {
 snapshot.set_emptyboard();
 history.append(snapshot);
 }
 voidset_boarddump(int[] all64, int startpos) {
 snapshot.set_boarddump(all64,startpos);
 dumped =true;
 history.append(snapshot);
 }
 voidset_fieldupdate(int piece, int pos) {
 snapshot.set_fieldupdate(piece,pos);
 updated =true;
 history.append(snapshot);
 }
}
rdgtConfig.java
---
classrdgtConfig {
 StringgetDbServer() { return server; }
 String getDbUser(){ return user; }
 StringgetDbPass() { return pass; }
 StringgetDbBase() { return dbase; }
 booleanuseDbServer() { return mysql; }
 booleanusePgnWriter() { return pgn; }
 StringgetPgnFileName() { return pgnfile; }
 Stringserver= «localhost»;
 String user=«root»;
 String pass=«zar1562»;
 String dbase=«rdgt_development»;
 boolean mysql= true;
 boolean pgn =false;
 Stringpgnfile = «default.pgn»;
}
rdgtController.java
---
classrdgtController extends rdgtProtocol {
rdgtDatabasedb;
rdgtInterpreteripr;
rdgtReceiverrec;
rdgtSerialportser;
rdgtSendersnd;
publicrdgtController() {
db = newrdgtDatabase();
ipr = newrdgtInterpreter(db);
rec = newrdgtReceiver(ipr);
ser = newrdgtSerialport(rec);
snd = newrdgtSender(ser);
}
boolean connect(Stringcomport) {
if(ser.open(comport)==false) {
System.out.println(«Couldnot open „+comport);
return false;
}
System.out.println(“COMport opened: „+comport);
return true;
}
intfind_all_boards() {
System.out.println(“Scanningfor boards...»);
db.unalive_all();
int alive = 0;
while (true) {
try{Thread.sleep(300);} catch(Throwable t) {}
snd.send(DGT_BUS_PING,0);
try{Thread.sleep(1100);} catch(Throwable t) {}
int alivenow =db.count_alive();
if (alivenow== alive) break;
alive =alivenow;
for(Enumeration e = db.get_boards(); e.hasMoreElements() ;) {
rdgtChessboardb = (rdgtChessboard)(e.nextElement());
if(b.get_alive()==true) {
snd.send(DGT_BUS_IGNORE_NEXT_BUS_PING,b.get_address());
}
}
}
System.out.println(«Scanningcompleted, found „+Integer.toString(alive)+“ boards.\n»);
return alive;
}
voiddump_all_active_boards() {
for(Enumeration e = db.get_boards(); e.hasMoreElements() ;) {
rdgtChessboardb = (rdgtChessboard)(e.nextElement());
if(b.get_alive()==true) {
b.set_dumped(false);
for (int i=0;i
snd.send(DGT_BUS_SEND_BRD,b.get_address());
try{Thread.sleep(200);} catch(Throwable t) {}
}
if(b.get_dumped()==false) {
System.out.println(«Board»+Integer.toString(b.get_address())+" does not reply todump_board.");
b.set_alive(false);
}
}
}
}
voidpoll_all_active_boards() {
int TIMEOUT =100;
for(Enumeration e = db.get_boards(); e.hasMoreElements() ;) {
rdgtChessboardb = (rdgtChessboard)(e.nextElement());
if(b.get_alive()==true) {
snd.send(DGT_BUS_SEND_CLK,b.get_address());
try{Thread.sleep(TIMEOUT);} catch(Throwable t) {}
b.set_updated(false);
snd.send(DGT_BUS_SEND_CHANGES,b.get_address());
try{Thread.sleep(TIMEOUT);} catch(Throwable t) {}
for (int i=0;i
if(b.get_updated()==true) break;
snd.send(DGT_BUS_REPEAT_CHANGES,b.get_address());
try{Thread.sleep(TIMEOUT);} catch(Throwable t) {}}
if(b.get_updated()==false) {
System.out.println(«Board»+Integer.toString(b.get_address())+" does not reply anymore.");
b.set_alive(false);
} else {
 b.print_position();
 }
}
}
}
}
rdgtDatabase.java
---
classrdgtDatabase {
Hashtableboards;
publicrdgtDatabase() {
boards = newHashtable();
}
rdgtChessboardget_board(int address) {
Integer_address = new Integer(address);
rdgtChessboardb = (rdgtChessboard)(boards.get(_address));
if (b==null) {
System.out.println(«Newboard found: ID=»+_address.toString());
b = newrdgtChessboard(_address, this);
boards.put(_address,b);
}
return b;
}
intget_boardcount() {
returnboards.size();
}
Enumerationget_boards() {
returnboards.elements();
}
voidunalive_all() {
for(Enumeration e = boards.elements(); e.hasMoreElements() ;) {
((rdgtChessboard)(e.nextElement())).set_alive(false);
}
}
intcount_alive() {
int x = 0;
for(Enumeration e = boards.elements(); e.hasMoreElements() ;) {
if(((rdgtChessboard)(e.nextElement())).get_alive()==true) x++;
}
return x;
}
}
rdgtFenboard.java
---
classrdgtFenboard {
 int[]itsBoard;
 StringitsFen;
 publicrdgtFenboard(){
itsBoard = newint[64];
for(inti=0;i
 itsBoard[i]='.';
itsFen="";
 }
 publicrdgtFenboard(String fen){ setBoard(fen); }
 publicrdgtFenboard(int[] board) { setBoard(board); }
 publicboolean setBoard(String fen){
if(!validateFen(fen))
 return false;
itsBoard=fen2board(fen);
itsFen=fen;
return true;
 }
 public intgetPieceAt(int x, int y){
if(x7 || y7) return 0;
returnitsBoard[y*8+x];
 }
public booleansetBoard(int[] board){
if(board.length!= 64)
 return false;
itsBoard=board;
return true;
 }
 public voidprint(){
printBoard(itsBoard);
 }
 public int[]getBoard() { return itsBoard; }
 publicrdgtFenboard mask(rdgtFenboard b){
rdgtFenboardoutput;
output=newrdgtFenboard(mask(getBoard(),b.getBoard()));
return output;
 }
 public intdiffCount(rdgtFenboard b){
rdgtFenboard m= mask(b);
int[]table=m.getBoard();
int output=0;
for(inti=0;i
 if(table[i]!='.')
output++;
}
return output;
 }
 int[]fen2board(String aFen){
 int[] board =new int[64];
 int square=0;
 int chr=0;
 while(square
 char c =aFen.charAt(chr);
if(c=='r'||c=='R'||c=='n'||c=='N'||c=='b'||c=='B'||c=='q'||c=='Q'||c=='k'||c=='K'||c=='p'||c=='P'){
 board[square]=c;
 square++;
 }
 if(c>='1'&& c
 for(inti=0;i
 board[square]='.';
 square++;
 }
 }
 chr++;
 }
 return board;
 }
 String[]outputBoard(int[] board){
 Strings="";
 String[] out= new String[8];
 for(intchr=0;chr
 if(board[chr]
 s +="-" + (char)(Math.abs(board[chr]));
 elseif(board[chr]==0)
 s += ",";
 else
 s +=(char)board[chr] + " ";
 if((chr+1)%8==0){
 out[chr/8]=s;
 s="";
 }
 }
 return out;
 }
 voidprintBoard(int[] board){
 String[] out= outputBoard(board);
 for(inti=0;i
 System.out.println(out[i]);
 }
 System.out.println();
 }
 int[]mask(int[] b1, int[] b2){
 int[]output=new int[64];
 for(inti=0;i
 if(b2[i]!=b1[i]){
 if(b2[i]=='.')
 output[i]=-b1[i];
 else
 output[i]=b2[i];
 }
 else
 output[i] ='.';//b2[i]-b1[i];
 }
 returnoutput;
 }
 booleanvalidateFen(String aFen){
 /* Only checkboard part of FEN */
 if(aFen.indexOf('')>0){
 aFen =aFen.substring(0,aFen.indexOf(' '));
 }
 int s=0;
 for(intc=0;c
 if(aFen.charAt(c)== '/') s++;
 }
 if(s!=7)return false;
 int x=0;
 for(intc=0;c
 if(aFen.charAt(c)== '/'){
 if(x!=8)return false;
 else x=0;
 }
 else
 {
if(aFen.charAt(c)>= '1' && aFen.charAt(c)
 x+=aFen.charAt(c)-'1' ;
x++;
 }
 }
 if(x!=8)return false;
 return true;
 }
}
rdgtFendiff.java
---
classrdgtFendiff {
 char piece;
 booleanadded;
 int square;
 rdgtFenboardbefore;
 rdgtFenboardafter;
 publicrdgtFenboard getBefore() { return before; }
 publicrdgtFenboard getAfter() { return after; }
 public chargetPiece() { return piece; }
 publicboolean isAdded() { return added; }
 public intgetSquare() { return square; }
 publicboolean isWhite(){
if(piece>'A'&& piece
 return true;
else
 return false;
 }
 publicboolean equals(rdgtFendiff other){
if(getPiece()!= other.getPiece()) return false;
if(getSquare()!= other.getSquare()) return false;
if(isAdded()!= other.isAdded()) return false;
return true;
 }
 publicrdgtFendiff() {
secured=false;
 }
 publicrdgtFendiff(char piece, boolean added, int square){
set(piece,added,square);
 }
 publicrdgtFendiff(int piece, int square){
if(piece
 this.piece =(char)(-piece);
 added=false;
}
else {
 this.piece=(char)piece;
 added=true;
}
this.square=square;
 }
publicrdgtFendiff(int piece,int square, rdgtFenboard before, rdgtFenboard after){
this.before=before;
this.after=after;
if(piece
 this.piece =(char)(-piece);
 added=false;
}
else {
 this.piece=(char)piece;
 added=true;
}
this.square=square;
 }
 public voidset(char piece, boolean added, int square){
this.piece=piece;
this.added=added;
this.square=square;
 }
 public StringtoString() {
String output= ""+piece;
if(added)output += "@";
else output +="&";
output +=(char)((square)%8+'a') + "" + (8-square/8);
return output;
 }
}
rdgtFenhax.java
---
public classrdgtFenhax {
 staticboolean debug=false;
 staticboolean rotated=false;
 publicrdgtFenhax(){
boards=newArrayList();
moves=newmovelist();
diffTable=newArrayList();
result="?-?";
plyCount=0;
 }
 static StringgetMoves(boolean shortNotation, boolean nice) {
calcMoves();
returnmoves.getAll(shortNotation,nice);
 }
 static StringgetMoves(){
returngetMoves(false,false);
 }
 static intgetPlyCount(){
calcMoves();
returnmoves.size();
 }
 static voidclear(){
boards.clear();
moves.clear();
diffTable.clear();
result="?-?";
 }
 static StringgetResult() { return result; }
 staticboolean add(String aFen){
rdgtFenboard f= new rdgtFenboard();
if(!f.setBoard(aFen))
 return false;
boards.add(f);
if(aFen.indexOf(«rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR»)>=0){
 clear();
 boards.add(f);
}
if((aFen.indexOf(«rnbq1bnr/pppppppp»)>=0 && aFen.indexOf(«PPPPPPPP/RNBQ1BNR») >= 0)||
 (aFen.indexOf(«rnbqkbnr/pppppppp»)>=0 && aFen.indexOf(«PPPPPPPP/RNBQ1BNR») >= 0)||
 (aFen.indexOf(«rnbq1bnr/pppppppp»)>=0 && aFen.indexOf(«PPPPPPPP/RNBQKBNR») >= 0)){
 int[]b=f.getBoard();
 booleanblack=false;
 booleanwhite=false;
 for(inti=16;i
if(b[i] =='k') black=true;
if(b[i] =='K') white=true;
 }
 if(black&& white) result=«1/2-1/2»;
 elseif(black) result=«0-1»;
 elseif(white) result=«1-0»;
}
if(boards.size()>=2){
 rdgtFenboardlast = (rdgtFenboard)boards.get(boards.size()-1);
 rdgtFenboardnextlast = (rdgtFenboard)boards.get(boards.size()-2);
 if(last.diffCount(nextlast)
rdgtFenboardm=nextlast.mask(last);
int[] mask =m.getBoard();
 for(inti=0;i
 if(mask[i] !='.' && mask[i]
diffTable.add(newrdgtFendiff(mask[i],i,nextlast,last));
 }
}
 for(inti=0;i
 if(mask[i] !='.' && mask[i]>0){
diffTable.add(newrdgtFendiff(mask[i],i,nextlast,last));
 }
}
 }
 else {
clear();
boards.add(f);
 }
}
return true;
 }
 static voidcalcMoves(){
moves.clear();
if(debug){
 for(inti=0;i
System.out.print(i+ ":" + ((rdgtFendiff)diffTable.get(i)).toString() + " ");
 }
 System.out.print("\n");
}
int offset=0;
intlength=diffTable.size();
while(offset
 intstart=offset;
 int end=-1;
boolean turn =isWhite( ((rdgtFendiff)diffTable.get(offset)).getPiece() );
 int i=start;
 while(end==-1){
rdgtFendifftest = (rdgtFendiff)diffTable.get(i);
if(turn !=isWhite(test.getPiece()) && test.isAdded()){
 end=i-1;
}
else{
 i++;
 if(i>=length)
end=length-1;
}
if(turn==isWhite(test.getPiece())&& test.isAdded()){
 offset=i;
}
 }
 if(offset==start)offset++;
 if(debug) System.out.print(start+ "-"+end+" ");
 movelistchunkMoves = new movelist(true,true);
 for(ints=start;s
rdgtFendiff a= (rdgtFendiff)diffTable.get(s);
for(inte=s+1;e
 rdgtFendiff b= (rdgtFendiff)diffTable.get(e);
 if(a.getPiece()== b.getPiece() && a.getSquare() != b.getSquare()){
if(!a.isAdded()&& b.isAdded()){
 Stringspecial="";
 if(b.getPiece()=='P'&& b.getSquare()/8==0){
for(intj=e+1;j
 rdgtFendiffprom = (rdgtFendiff)diffTable.get(j);
 if(prom.isAdded()&& prom.isWhite()){
if(a.getSquare()%8!= b.getSquare()%8)
 special+=pos2xy(a.getSquare()).substring(0,1)+«x»;
special+=pos2xy(b.getSquare())+"="+prom.getPiece();
b=prom;
 }
}
 }
 if(b.getPiece()=='p'&& b.getSquare()/8==7){
for(intj=e+1;j
 rdgtFendiffprom = (rdgtFendiff)diffTable.get(j);
 if(prom.isAdded()&& prom.isWhite()){
if(a.getSquare()%8!= b.getSquare()%8)
 special+=pos2xy(a.getSquare()).substring(0,1)+«x»;
special+=pos2xy(b.getSquare())+"="+prom.getPiece();
b=prom;
 }
}
 }
 chunkMoves.add(newmove(a,b,special));
}
 }
}
 }
 if(chunkMoves.size()==0){
rdgtFendiff a= (rdgtFendiff)diffTable.get(start);
for(ints=start;s
 rdgtFendiff b= (rdgtFendiff)diffTable.get(s);
 if(b.isAdded()){
if(a.getPiece()=='P'&& a.getSquare()/8==1 && !a.isAdded()){
 Stringspecial="";
 if(a.getSquare()%8!= b.getSquare()%8)
special+=pos2xy(a.getSquare()).substring(0,1)+«x»;
 special+=pos2xy(b.getSquare())+"="+b.getPiece();
 chunkMoves.add(newmove(a,b,special));
}
elseif(a.getPiece()=='p' && a.getSquare()/8==6 && !a.isAdded()){
 String special="";
 if(a.getSquare()%8!= b.getSquare()%8)
special+=pos2xy(a.getSquare()).substring(0,1)+«x»;
 special+=pos2xy(b.getSquare())+"="+b.getPiece();
 chunkMoves.add(newmove(a,b,special));
}
else
 chunkMoves.add(newmove(a,b,""+a.getPiece()+"@"+pos2xy(a.getSquare())));
 }
}
 }
 for(intj=0;j
if(debug)System.out.print( (chunkMoves.get(j)).toString() + " ");
moves.add(chunkMoves.get(j));
 }
 if(debug) System.out.print("\n");
}
 }
 static Stringpos2xy(int pos){
String s ="" + (char)((pos)%8+'a') + "" + (8-pos/8);
return s;
 }
 staticboolean isWhite(char piece){
if(piece>'A'&& piece
 return true;
else
 return false;
 }
 staticmovelist moves;
 staticArrayList boards;
 staticArrayList diffTable;
 static Stringresult;
 static intplyCount;
}
class move {
 rdgtFendifffrom;
 rdgtFendiffto;
 boolean take;
 Stringspecial;
 publicmove(rdgtFendiff from, rdgtFendiff to){
this.from=from;
this.to=to;
take=false;
special="";
 }
 publicmove(rdgtFendiff from, rdgtFendiff to, String special){
this.from=from;
this.to=to;
take=false;
this.special=special;
 }
 publicrdgtFendiff getFrom(){ return from; }
 publicrdgtFendiff getTo(){ return to; }
 public chargetPiece(){ return from.getPiece(); }
 public intgetFromSquare() { return from.getSquare(); }
 public intgetToSquare() { return to.getSquare(); }
 public StringgetFromCor() { return pos2xy(getFromSquare()); }
 public StringgetToCor() { return pos2xy(getToSquare()); }
 public booleanisWhite() { return from.isWhite(); }
 public StringlongNotation() { return moveString(false); }
 public StringshortNotation() { return moveString(true); }
 public voidsetTake(boolean take){ this.take=take; }
 publicboolean getTake() { return take; }
StringmoveString(boolean shortNotation){
if(!special.equals("")){
 if(isCheck(isWhite()))
return special+ "+";
 else
returnspecial;
}
 
booleanep=false;
chartakeBit='-';
if(take)takeBit='x';
Strings="";
if(getPiece()!='p'&& getPiece()!='P')
 s+=newString(""+getPiece()).toUpperCase();
if(!shortNotation)
 s+=getFromCor()+takeBit;
else {
 if(getPiece()=='R'|| getPiece()=='r')
if(findRookLength(getToSquare()%8,getToSquare()/8,getPiece()))
 s+=getFromCor()+takeBit;
 if(getPiece()=='N'|| getPiece()=='n')
if(findNightLength(getToSquare()%8,getToSquare()/8,getPiece()))
 s+=getFromCor()+takeBit;
 if(getPiece()=='B'|| getPiece()=='b')
if(findBishopLength(getToSquare()%8,getToSquare()/8,getPiece()))
 s+=getFromCor()+takeBit;
 if(getPiece()=='Q'|| getPiece()=='q')
if(findQueenLength(getToSquare()%8,getToSquare()/8,getPiece()))
 s+=getFromCor()+takeBit;
 if(getPiece()=='P'|| getPiece()=='p')
if(!getFromCor().substring(0,1).equals( getToCor().substring(0,1) ) ) {
 s+=getFromCor().substring(0,1)+«x»;
 if(!take)ep=true;
}
 if(take&& s.length()>=1){
if(s.charAt(s.length()-1)!= 'x')
 s+=«x»;
 }
}
s+=getToCor();
if(ep)
 s+="ep.";
/** Is it acheck? **/
if(isCheck(isWhite()))s+='+';
return s;
 }
 booleanisCheck(boolean white){
int k=-1;
int K=-1;
for(inti=0;i
 if(to.getAfter().getPieceAt(i%8,i/8)== 'k') k=i;
 if(to.getAfter().getPieceAt(i%8,i/8)== 'K') K=i;
}
booleancheck=false;
if(white){
 if(findQueenLength(k%8,k/8,'Q'))check=true;
 if(findRookLength(k%8,k/8,'R'))check=true;
 if(findBishopLength(k%8,k/8,'B'))check=true;
 if(findNightLength(k%8,k/8,'N'))check=true;
 if(findPawnLength(k%8,k/8,'P'))check=true;
}
else{
 if(findQueenLength(K%8,K/8,'q'))check=true;
 if(findRookLength(K%8,K/8,'r'))check=true;
 if(findBishopLength(K%8,K/8,'b'))check=true;
 if(findNightLength(K%8,K/8,'n'))check=true;
 if(findPawnLength(K%8,K/8,'p'))check=true;
}
return check;
 }
 /** Is therea night on a night-distance from square? **/
 booleanfindNightLength(int x, int y,char n){
rdgtFenboard b= to.getAfter();
if(b.getPieceAt(x-1,y-2)== n) return true;
if(b.getPieceAt(x+1,y-2)== n) return true;
if(b.getPieceAt(x-2,y-1)== n) return true;
if(b.getPieceAt(x+2,y-1)== n) return true;
if(b.getPieceAt(x-2,y+1)== n) return true;
if(b.getPieceAt(x+2,y+1)== n) return true;
if(b.getPieceAt(x-1,y+2)== n) return true;
if(b.getPieceAt(x+1,y+2)== n) return true;
return false;
 }
 booleanfindRookLength(int x, int y, char r){
rdgtFenboard b= to.getAfter();
int xx=0;
int yy=0;
do{
 xx++;
 if(b.getPieceAt(x+xx,y+yy)== r) return true;
}while(b.getPieceAt(x+xx,y+yy)== '.');
xx=0;
do{
 xx--;
 if(b.getPieceAt(x+xx,y+yy)== r) return true;
}while(b.getPieceAt(x+xx,y+yy)== '.');
xx=0;
do{
 yy--;
 if(b.getPieceAt(x+xx,y+yy)== r) return true;
}while(b.getPieceAt(x+xx,y+yy)== '.');
yy=0;
do{
 yy++;
 if(b.getPieceAt(x+xx,y+yy)== r) return true;
}while(b.getPieceAt(x+xx,y+yy)== '.');
return false;
 }
 booleanfindBishopLength(int x, int y, char r){
rdgtFenboard b= to.getAfter();
int xx=0;
int yy=0;
do{
 xx++;
 yy++;
 if(b.getPieceAt(x+xx,y+yy)== r) return true;
}while(b.getPieceAt(x+xx,y+yy)== '.');
xx=0;
yy=0;
do{
 xx--;
 yy--;
 if(b.getPieceAt(x+xx,y+yy)== r) return true;
}while(b.getPieceAt(x+xx,y+yy)== '.');
xx=0;
yy=0;
do{
 yy--;
 xx++;
 if(b.getPieceAt(x+xx,y+yy)== r) return true;
}while(b.getPieceAt(x+xx,y+yy)== '.');
yy=0;
xx=0;
do{
 yy++;
 xx--;
 if(b.getPieceAt(x+xx,y+yy)== r) return true;
}while(b.getPieceAt(x+xx,y+yy)== '.');
return false;
 }
 booleanfindQueenLength(int x, int y, char q){
if(findRookLength(x,y,q))return true;
if(findBishopLength(x,y,q))return true;
return false;
 }
 booleanfindPawnLength(int x, int y, char p){
rdgtFenboard b= to.getAfter();
if(p=='P'){
 if(b.getPieceAt(x-1,y-1)==p)return true;
 if(b.getPieceAt(x+1,y-1)==p)return true;
}
else {
 if(b.getPieceAt(x-1,y-1)==p)return true;
 if(b.getPieceAt(x+1,y-1)==p)return true;
}
return false;
 }
 public StringtoString(){
return""+from.toString() + "-" + to.toString();
 }
 publicboolean equals(move other){
if(!from.equals(other.getFrom() )) return false;
if(!to.equals(other.getTo() )) return false;
return true;
 }
 Stringpos2xy(int pos){
 String s ="" + (char)((pos)%8+'a') + "" + (8-pos/8);
 return s;
 }
}
class movelist{
 ArrayListmoves;
 booleanunique;
 booleannoSmooth;
public voidclear(){moves.clear(); }
public voidremove(int n) { moves.remove(n); }
publicmovelist(){ moves=new ArrayList(); unique=false; }
publicmovelist(boolean unique, boolean noSmooth) {
moves=newArrayList();
this.unique=unique;
this.noSmooth=noSmooth;
 }
 public moveget(int n){ return (move)moves.get(n); }
 public intsize() { return moves.size(); }
 public StringtoString() { return getAll(false,false); }
 public voidprint(boolean shortNotation) {
System.out.println(«Moves»);
System.out.print(getAll(shortNotation,true));
 }
 voidfixTakes(){
for(inti=1;i
 int toSquare= ((move)moves.get(i)).getToSquare();
 char p =(char) ((move)moves.get(i-1)).getTo().getAfter().getBoard()[toSquare];
 if(p!='.'){
movem=(move)moves.get(i);
m.setTake(true);
moves.set(i,m);
 }
}
 }
 
 public StringgetAll(boolean shortNotation,boolean nice){
fixTakes();
Stringoutput="";
booleanlastColor=false;
int n=1;
for(inti=0;i
 movem=(move)moves.get(i);
 if(m.isWhite()&& lastColor==false){
if(nice)
 output +=n+".\t";
else
 output +=n+". ";
n++;
 }
 if(n==1&& !m.isWhite()) {
if(nice)
 output +=«1.\t...\t\t»;
else
 output +=«1.… »;
 }
 lastColor=m.isWhite();
 intlength=output.length();
 if(shortNotation)
output +=m.shortNotation()+" ";
 else
output +=m.longNotation()+" ";
 if(nice){
if(!m.isWhite())
 output +="\n";
else{
 if(output.length()-length
 if(output.length()-length
}
 }
}
return output;
 }
public voidadd(move aMove){
if(!unique){
 moves.add(aMove);
 return;
}
for(inti=0;i
 if(((move)moves.get(i)).equals(aMove))
return;
}
if(moves.size()>=1){
 movem=(move)moves.get(moves.size()-1);
 // O-O
 if(m.moveString(false).equals(«Ke1-g1»)&& aMove.moveString(false).equals(«Rh1-f1»)){
moves.remove(moves.size()-1);
moves.add(newmove(aMove.getFrom(),aMove.getTo(),«O-O»));
return;
 }
 // O-O-O
 if(m.moveString(false).equals(«Ke1-c1»)&& aMove.moveString(false).equals(«Ra1-d1»)){
moves.remove(moves.size()-1);
moves.add(newmove(aMove.getFrom(),aMove.getTo(),«O-O-O»));
return;
 }
 // O-O
 if(m.moveString(false).equals(«Ke8-g8»)&& aMove.moveString(false).equals(«Rh8-f8»)){
moves.remove(moves.size()-1);
moves.add(newmove(aMove.getFrom(),aMove.getTo(),«O-O»));
return;
 }
 // O-O-O
 if(m.moveString(false).equals(«Ke8-c8»)&& aMove.moveString(false).equals(«Ra8-d8»)){
moves.remove(moves.size()-1);
moves.add(newmove(aMove.getFrom(),aMove.getTo(),«O-O-O»));
return;
 }
}
moves.add(aMove);
 }
 public voidremoveSmooth(){
for(inta=0;a
 moveaMove=(move)moves.get(a);
 for(inti=0;i
move test =(move)moves.get(i);
if(test.getPiece() == aMove.getPiece()){
 if(aMove.getFrom().getSquare() == test.getTo().getSquare() ||
 aMove.getTo().getSquare()== test.getFrom().getSquare() ){
if(a==i){
 moves.remove(i);
 i=moves.size();
 a=0;
}
elseif(i>a){
 moves.remove(i);
 moves.remove(a);
 i=moves.size();
 a=0;
}
else {
 moves.remove(a);
 moves.remove(i);
 i=moves.size();
 a=0;
}
 }
}
 }
 }
 }
}
rdgtHistory.java
---
classrdgtHistory {
Vector history= new Vector();
rdgtSnapshotlastadded = null;
rdgtSnapshotlast = null;
rdgtChessboardboard;
publicrdgtHistory(rdgtChessboard _board) {
board =_board;
}
voidappend(rdgtSnapshot x) {
if(history.size()==0){
history.addElement(x.copy());
board.update_html();
}
elseif(x.sameas((rdgtSnapshot)history.lastElement())==false ){
history.addElement(x.copy());
board.update_html();
}
}
voiddebugprint() {
System.out.println("=======History for board: "+board.address.toString());
for(Enumeration e = history.elements(); e.hasMoreElements() ;) {
((rdgtSnapshot)(e.nextElement())).debugprint();
}
}
}
rdgtHtml.java
---
class rdgtHtmlextends rdgtProtocol {
static Stringextension = ".html";
static Stringindexfilename = «board_index»;
static Stringhistoryprefix = «boardhistory_»;
static Stringsnapshotprefix = «boardsnapshot_»;
static voidprint_index(rdgtDatabase db) {
StringBuffer s= new StringBuffer(2000);
s.append("\n\n\n\n");
s.append("Chessboards\n\n");
s.append("BoardidStatusTime of lastmoveSnapshotHistory\n");
for(Enumeration e = db.get_boards(); e.hasMoreElements() ;) {
rdgtChessboardb = (rdgtChessboard)(e.nextElement());
s.append("\n");
s.append(Integer.toString(b.get_address()));
s.append("\n");
if(b.get_alive()==true) s.append(«Online»); elses.append(«Offline»);
s.append("");
s.append(b.get_snapshot().get_time().toString());
s.append("\n
s.append(snapshotprefix);
s.append(Integer.toString(b.get_address()));
s.append(extension);
s.append("\">Link
s.append(historyprefix);
s.append(Integer.toString(b.get_address()));
s.append(extension);
s.append("\">Link\n");
}
s.append("\n\n\n");
if(writefile(indexfilename+extension, s.toString()) == false) {
System.err.println(«Error:Failed to write indexfile.»);
return;
}
}
static voidprint_history(rdgtHistory h) {
StringBuffer s= new StringBuffer(2000);
s.append("\n\n");
s.append("Historyfor Chessboard: ");
s.append(Integer.toString(h.board.get_address()));
s.append("\n");
int i = 0;
for(Enumeration e = h.history.elements(); e.hasMoreElements() ;) {
rdgtSnapshotss = (rdgtSnapshot)(e.nextElement());
i=i+1;
s.append("Move: ");
s.append(Integer.toString(i));
s.append("   ");
s.append(ss.get_time().toString());
s.append(boardview(ss));
s.append("\n");
}
s.append("\n\n");
if(writefile(historyprefix + Integer.toString(h.board.get_address()) + extension,s.toString()) == false) {
System.err.println(«Error:Failed to write historyfile.»);
return;
}
}
static Stringboardview(rdgtSnapshot b) {
StringBuffer s= new StringBuffer(1000);
s.append("\n");
boolean filled= true;
for (int i=0;i
s.append("");
for (int j=0;j
s.append("
int p =b.pieces[(i*8)+j];
if (p==EMPTY )s.append(«empty»);
else if(p==WPAWN ) s.append(«w_pawn»);
else if(p==WROOK ) s.append(«w_rook»);
else if(p==WKNIGHT) s.append(«w_knight»);
else if(p==WBISHOP) s.append(«w_bishop»);
else if(p==WKING ) s.append(«w_king»);
else if(p==WQUEEN ) s.append(«w_queen»);
else if(p==BPAWN ) s.append(«b_pawn»);
else if(p==BROOK ) s.append(«b_rook»);
else if(p==BKNIGHT) s.append(«b_knight»);
else if(p==BBISHOP) s.append(«b_bishop»);
else if(p==BKING ) s.append(«b_king»);
else if(p==BQUEEN ) s.append(«b_queen»);
if (filled)s.append(«1»); else s.append(«2»);
filled =!filled;
s.append(".gif\">");
}
filled =!filled;
s.append("\n");
}
s.append("\n");
returns.toString();
}
static voidprint_snapshot(rdgtSnapshot ss) {
StringBuffer s= new StringBuffer(2000);
s.append("\n\n\n\n");
s.append("Snapshotof Chessboard: ");
s.append(Integer.toString(ss.board.get_address()));
s.append("\n");
s.append(ss.get_time().toString());
s.append("\n");
s.append(boardview(ss));
s.append("\n\n\n");
if(writefile(snapshotprefix + Integer.toString(ss.board.get_address()) +extension, s.toString()) == false) {
System.err.println(«Error:Failed to write snapshotfile.»);
return;
}
}
static booleanwritefile(String filename, String content) {
FileWriter f =null;
for (int i=0;i
try {
f = newFileWriter(filename);
break;
}
catch(Throwable t) {
System.err.println(«Erroropening „+filename+“ for writing. Retrying...»);
}
}
if (f==null) {
System.out.println(«Failedto open file „+filename);
return false;
}
try {
f.write(content);
f.close();
}
catch(Exception e) {
System.out.println(“Errorwriting file „+filename+“. (»+e.toString()+")");
return false;
}
return true;
}
}
rdgtInterpreter.java
---
classrdgtInterpreter extends rdgtProtocol {
 rdgtDatabasedb;
 publicrdgtInterpreter(rdgtDatabase _db) {
 db = _db;
 }
 publicboolean interpret(int[] data) {
 int len =((int) data[1] * 0x80) + (int) data[2];
 int address =((int) data[3] * 0x80) + (int) data[4];
 String tmp =«Len:» + Integer.toString(len) + " Address:" +Integer.toString(address);
 if (data[0]== DGT_BUS_PING) {
 System.out.println(«Receivedmessage: PING » + tmp);
 } else if(data[0] == DGT_BUS_UPDATE) {
 System.out.println(«Receivedmessage: UPDATE » + tmp);
 } else if(data[0] == DGT_BUS_BWTIME) {
 System.out.println(«Receivedmessage: BWTIME » + tmp);
 } else {
 System.out.println(«Receivedmessage: (some other message) » + tmp);
 }
 if(check_checksum(data) == false) {
 System.out.println(«Messagefailed checksum test»);
 return false;
 }
 if (data[0]== DGT_BUS_PING) {
 if(data.length != 6) { // address+data
 System.out.println(«Illegal:Got a BUS_PING with wrong size»);
 return false;
 }
 db.get_board(address).set_alive(true);
 return true;
 } else if(data[0] == DGT_BUS_BRD_DUMP) {
 if(data.length != (6 + 64)) {
 System.out.println(«Illegal:Got a BUS_BRD_DUMP with wrong size»);
 return false;
 }
 rdgtChessboardc = db.get_board(address);
 c.set_boarddump(data,5);
 return true;
 } else if(data[0] == DGT_BUS_UPDATE) {
 byte pr[] =new byte[data.length — 5];
 for (int i =5; i
 pr[i — 5] =(byte) data[i];
 }
System.out.println(newString(pr));
 rdgtChessboardc = db.get_board(address);
 for (int i =5; i
 if (data[i]== EE_POWERUP) {
 }
 else if(data[i] == EE_EOF) {
 }
 else if(data[i] == EE_FOURROWS) {
 }
 else if(data[i] == EE_EMPTYBOARD) {
 c.set_emptyboard();
 } else if(data[i] == EE_DOWNLOADED) {
 }
 else if(data[i] == EE_BEGINPOS) {
 }
 else if(data[i] == EE_BEGINPOS_ROT) {
 }
 else if(data[i] == EE_START_TAG) {
 }
 else if(data[i] == EE_WATCHDOG_ACTION) {
 }
 else if(data[i] == EE_NOP) {
 }
 else if(data[i] >= 0x40 && data[i]
 c.set_fieldupdate(data[i]& 0x0F, data[i + 1]);
 i++;
 } else if((data[i] >= 0x60 && data[i] = 0x70&& data[i]
 i += 2;
 } else {
 System.out.println(«Unknowndata in DGT_BUS_UPDATE command.»);
 return false;
 }
 }
 c.set_updated(true);
 return true;
 }
 else if(data[0] == DGT_BUS_BWTIME) {
 if(data.length != 13) {
 System.out.println(«Illegal:Got a DGT_BUS_BWTIME with wrong size (!=10)»);
 return false;
 }
 if ((data[11]& 0x20) != 0) {
 System.out.println("(Noclock connected)");
 return true;
 }
 booleanrunning = (data[11] & 0x01) != 0;
 booleanbatteryLow = (data[11] & 0x04) != 0;
 booleanfrontViewLeftSideHigh = (data[11] & 0x02) != 0;
 booleanblackPlayersTurn = (data[11] & 0x08) != 0;
 booleanwhitePlayersTurn = (data[11] & 0x10) != 0;
 int hoursW =data[5] & 0x0F;
 int minutesW= (data[6] & 0x0F) + ((data[6] >> 4) * 10);
 int secondsW= (data[7] & 0x0F) + ((data[7] >> 4) * 10);
 int hoursB =data[8] & 0x0F;
 int minutesB= (data[9] & 0x0F) + ((data[9] >> 4) * 10);
 int secondsB= (data[10] & 0x0F) + ((data[10] >> 4) * 10);
 secondsW =(((hoursW * 60) + minutesW) * 60) + secondsW;
 secondsB = (((hoursB* 60) + minutesB) * 60) + secondsB;
 db.get_board(address).set_clockdata(running,batteryLow, frontViewLeftSideHigh,
 blackPlayersTurn,whitePlayersTurn, secondsW, secondsB);
 return true;
 } else if(data[0] == DGT_BUS_FROM_START) {
 } else if (data[0]== DGT_BUS_START_GAME_WRITTEN) {
 } else if(data[0] == DGT_BUS_VERSION) {
 }
 System.err.println(«Unknownmessage (checksum was ok).»);
 return true;
 }
 booleancheck_checksum(int[] data) {
 int sum = 0;
 for (int i =0; i
 sum = (sum +data[i]) & 0x7F;
 }
 if (sum ==data[data.length — 1]) {
 return true;
 }
 return false;
 }
}
rdgtMysql.java
---
classrdgtMysql extends rdgtProtocol {
static Stringserver= «localhost»;
static Stringuser= «root»;
static Stringpass= «zar1562»;
static Stringdbase= «rdgt_development»;
static Stringupdate_table= «games»;
 staticConnection conn = null;
 staticStatement stmt = null;
 staticboolean rotated=false;
 static Stringconnect()
{
try
{
Class.forName(«com.mysql.jdbc.Driver»).newInstance();
conn =DriverManager.getConnection(«jdbc:mysql://»+server+"/"+dbase+"?user="+user+"&password="+pass);
return"";
}
catch(SQLException e)
{
returne.getSQLState();
}
catch(Exception e)
{
return«0»;
}
}
static booleandisconnect()
{
if (conn !=null) {
try
{
conn.close();
return true;
}
catch(SQLException SQLE)
{
return false;
}
}
else
return false;
}
static Stringexecute(String expr)
{
try
{
stmt = null;
stmt =conn.createStatement();
stmt.executeUpdate(expr);
return"";
}
catch(SQLException e)
{
returne.getSQLState();
}
catch(Exception e)
{
return«0»;
}
finally
{
if (stmt !=null) {
try
{
stmt.close();
}
catch(SQLException SQLE)
{
;
}
}
}
}
static Stringsnapshot2fen (rdgtSnapshot b)
{
StringBuffer s= new StringBuffer(100);
int counter =0;
for (int i=0;i
{
for (int j=0;j
{
if ((counter!= 0) && (b.pieces[(i*8)+j] != EMPTY))
{
s.append(counter);
counter = 0;
}
switch(b.pieces[(i*8)+j])
{
caseWPAWN:s.append(«P»); break;
case WROOK:s.append(«R»); break;
case WKNIGHT:s.append(«N»); break;
case WBISHOP:s.append(«B»); break;
case WKING:s.append(«K»); break;
case WQUEEN:s.append(«Q»); break;
case BPAWN:s.append(«p»); break;
case BROOK:s.append(«r»); break;
case BKNIGHT:s.append(«n»); break;
case BBISHOP:s.append(«b»); break;
case BKING:s.append(«k»); break;
case BQUEEN:s.append(«q»); break;
default:counter++; break;
}
}
if (counter !=0)
s.append(counter);
s.append("/");
counter = 0;
}
String outfen=s.toString().substring(0,s.toString().length()-1);
switch(b.board.address.intValue()){
case 3737:
case 3811:
case 2896:
case 3740:
case 3588:
case 2897:
default:
 rotated=false;break;
}
if(rotated){
 String newFen="";
 for(inti=outfen.length()-1;i>=0;i--){
newFen +=outfen.charAt(i);
 }
 outfen=newFen;
}
return outfen;
}
static voidupdate_snapshot(rdgtSnapshot b)
{
if (conn !=null)
{
String fen =snapshot2fen(b);
String turn;
if(rotated){
 if(b.isWhiteTurn())turn=«Black»;
 elseturn=«White»;
}
else{
 if(b.isWhiteTurn())turn=«White»;
 elseturn=«Black»;
}
Stringsql_command = «UPDATE „+update_table+“ SET fen ='»+fen+"',wtime='"+b.getTimeWhite()+"',btime='"+b.getTimeBlack()+"',turn='"+turn+"'WHERE dgt_active like '%Fen%' AND dgt_board = "+b.board.address;
execute(sql_command);
System.out.println(b.board.address+""+fen+" "+b.getTimeWhite()+" "+b.getTimeBlack()+""+turn.substring(0,1));
}
}
static voidupdate_moves(String moves, String movestable, int board_id)
{
if (conn !=null)
{
 int t=0;
 if(moves.length()>20)t=moves.length()-20;
 System.out.println(board_id+ " Moves: " + moves.substring(t));
Stringsql_command = «UPDATE games SET moves = '»+moves+"' WHEREdgt_active like '%Moves%' AND dgt_board = "+board_id;
execute(sql_command);
}
}
}
rdgtProtocol.java
---
classrdgtProtocol {
static intDGT_TO_BUSMODE = 0x4a;
static intDGT_BUS_SEND_CLK = 0x01 | 0x80;
static intDGT_BUS_SEND_BRD = 0x02 | 0x80;
static intDGT_BUS_SEND_CHANGES = 0x03 | 0x80;
static intDGT_BUS_REPEAT_CHANGES = 0x04 | 0x80;
static intDGT_BUS_SET_START_GAME = 0x05 | 0x80;
static intDGT_BUS_SEND_FROM_START = 0x06 | 0x80;
static intDGT_BUS_PING = 0x07 | 0x80;
static intDGT_BUS_END_BUSMODE = 0x08 | 0x80;
static intDGT_BUS_RESET = 0x09 | 0x80;
static intDGT_BUS_IGNORE_NEXT_BUS_PING = 0x0a | 0x80;
static intDGT_BUS_SEND_VERSION = 0x0b | 0x80;
static intDGT_BUS_BRD_DUMP = 0x03 | 0x80;
static intDGT_BUS_BWTIME = 0x04 | 0x80;
static intDGT_BUS_UPDATE = 0x05 | 0x80;
static intDGT_BUS_FROM_START = 0x06 | 0x80;
static intDGT_BUS_START_GAME_WRITTEN = 0x08 | 0x80;
static intDGT_BUS_VERSION = 0x09 | 0x80;
static booleanis_busmessage(int m) {
return (m==DGT_BUS_BRD_DUMP || m == DGT_BUS_BWTIME ||
m ==DGT_BUS_UPDATE || m == DGT_BUS_FROM_START || m == DGT_BUS_PING ||
m ==DGT_BUS_START_GAME_WRITTEN || m == DGT_BUS_VERSION);
}
static finalint EMPTY = 0x00;
static finalint WPAWN = 0x01;
static finalint WROOK = 0x02;
static finalint WKNIGHT = 0x03;
static finalint WBISHOP = 0x04;
static finalint WKING = 0x05;
static finalint WQUEEN = 0x06;
static finalint BPAWN = 0x07;
static finalint BROOK = 0x08;
static finalint BKNIGHT = 0x09;
static finalint BBISHOP = 0x0a;
static finalint BKING = 0x0b;
static finalint BQUEEN = 0x0c;
booleanis_piece(int p) {
return(p==EMPTY || p==WPAWN || p==WROOK ||
 p==WKNIGHT ||p==WBISHOP || p==WKING ||
 p==WQUEEN ||p==BPAWN || p==BROOK ||
 p==BKNIGHT ||p==BBISHOP || p==BKING ||
 p==BQUEEN);
}
static intEE_POWERUP = 0x6a;
static intEE_EOF = 0x6b;
static intEE_FOURROWS = 0x6c;
static intEE_EMPTYBOARD = 0x6d;
static intEE_DOWNLOADED = 0x6e;
static intEE_BEGINPOS = 0x6f;
static intEE_BEGINPOS_ROT = 0x7a;
static intEE_START_TAG = 0x7b;
static intEE_WATCHDOG_ACTION = 0x7c;
static intEE_NOP = 0x7f;
}
rdgtReceiver.java
---
classrdgtReceiver extends rdgtProtocol {
intmessagetype;
intmessagelen_msb;
intmessagelen_lsb;
int[] data;
int useddata;
int state;
rdgtInterpreterinterpreter;
publicrdgtReceiver(rdgtInterpreter _interpreter) {
state = 0;
interpreter =_interpreter;
}
voidreceive(int[] d) {
char c[] ={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
StringBuffer x= new StringBuffer(«Received: „);
for (int i=0;i
x.append(c[d[i]>>4]).append(c[d[i]& 0x0F]).append(“ „);
}
if(rdgtChess.debug) System.out.println(x.toString());
_receive (d,0);
}
void_receive(int[] d, int start) {
if (start ==d.length) return;
if (state ==0) { // Find a known messageid.
while(start
if(is_busmessage(d[start])) {
messagetype =d[start];
state = 1;
_receive(d,start+1);
return;
}
System.err.println(“Didnot understand 1 byte of incoming data.»);
start = start+ 1;
}
return;
}
if (state ==1) {
if ((d[start]& 0x80) > 0) {
System.err.println(«Didnot understand 2 bytes of incoming data.»);
state = 0;
_receive(d,start);
return;
}
messagelen_msb= d[start];
state = 2;
start = start+ 1;
}
if (start ==d.length) return;
if (state ==2) {
if ((d[start]& 0x80) > 0) {System.err.println(«Did not understand 3 bytes ofincoming data.»);
state = 0;
_receive(d,start);
return;
}
messagelen_lsb= d[start];
state = 3;
start = start+ 1;
int newlen =((int)messagelen_msb * 0x80) + (int)messagelen_lsb;
if (newlen
System.out.println(«Toosmall message length: » + Integer.toString(newlen));
state = 0;
_receive(d,start);
return;
}
data = newint[newlen];
data[0] =messagetype;
data[1] =messagelen_msb;
data[2] =messagelen_lsb;
useddata = 3;
}
if (start ==d.length) return;
if (state ==3) {
while(start
data[useddata]=d[start];
start = start+ 1;
useddata =useddata + 1;
}
if (useddata== data.length) {
interpreter.interpret(data);
start = start+ 1;
data = null;
state = 0;}
}
_receive(d,start);
}
}
rdgtSender.java
---
classrdgtSender extends rdgtProtocol {
rdgtSerialportcom;
publicrdgtSender(rdgtSerialport _com) {
com = _com;
}
void send(intmessage, int address) {
String tmp =«Address:»+Integer.toString(address);
System.out.println();
if(message==DGT_TO_BUSMODE) System.out.println(«Sending message: SWITCH TOBUSMODE „+tmp);
else if(message==DGT_BUS_SEND_BRD) System.out.println(“Sending message: SENDBOARD „+tmp);
else if(message==DGT_BUS_SEND_CHANGES) System.out.println(“Sending message: SENDCHANGES „+tmp);
else if(message==DGT_BUS_REPEAT_CHANGES) System.out.println(“Sending message:REPEAT CHANGES „+tmp);
else if(message==DGT_BUS_PING) System.out.println(“Sending message: PING»+tmp);
else if(message==DGT_BUS_IGNORE_NEXT_BUS_PING) System.out.println(«Sendingmessage: IGNORE NEXT PING „+tmp);
elseSystem.out.println(“Sending message: (some other message)»);
byte x[] = newbyte[4];
x[0] =(byte)message;
x[1] =(byte)((address>>7) & 0x7F);
x[2] =(byte)(address & 0x7F);
x[3] =(byte)(((int)x[0]+(int)x[1]+(int)x[2]) & 0x7F);
 com.write(x);
}
}
rdgtSerialport.java
---
classrdgtSerialport implements SerialPortEventListener {
staticCommPortIdentifier portid;
InputStreaminStream;
OutputStreamoutStream;
SerialPortserialPort;
rdgtReceiverreceiver;
publicrdgtSerialport(rdgtReceiver r) {
receiver = r;
}
public booleanopen(String portname) {
CommPortIdentifierid = null;
EnumerationportList;
portList =CommPortIdentifier.getPortIdentifiers();
System.out.println(portList.toString());
while(portList.hasMoreElements()) {
System.out.println(«2»);
id = (CommPortIdentifier)portList.nextElement();
if(id.getPortType() == CommPortIdentifier.PORT_SERIAL) {
System.out.println(«Ports:»+id.getName());
if(id.getName().equals(portname)) break; // found
}
id = null;
}
if (id ==null) return false; // not found
try {
serialPort =(SerialPort) id.open(«ttchess», 2000);
inStream =serialPort.getInputStream();
outStream =serialPort.getOutputStream();
serialPort.addEventListener(this);
serialPort.notifyOnDataAvailable(true);
serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
serialPort.setDTR(false);
serialPort.setRTS(false);
} catch(Exception e) { return false; }
return true;
}
public booleanwrite(byte[] data) {
char c[] ={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
StringBuffer x= new StringBuffer(" Sending: ");
for (int i=0;i
int d =data[i];
if (d
x.append(c[d>>4]).append(c[d& 0x0F]).append(" ");
}
if (rdgtChess.debug)System.out.println(x.toString());
try {
outStream.write(data);
} catch(IOException e) { return false; }
return true;
}
public voidserialEvent(SerialPortEvent event) {
switch(event.getEventType()){
caseSerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
caseSerialPortEvent.DATA_AVAILABLE:
byte[]readBuffer = new byte[200];
try {
while(inStream.available() > 0) {
int numBytes =inStream.read(readBuffer);
if(numBytes>0) {
int[] buf =new int[numBytes];
for (int i=0;i
int tmp =readBuffer[i];
if (tmp
buf[i]=tmp;
}
receiver.receive(buf);
}
}
} catch(IOException e) {}
break;
}
}
}
rdgtSnapshot.java
---
classrdgtSnapshot extends rdgtProtocol {
int[] pieces =new int[64];
Date time;
rdgtChessboardboard;
booleanclkRunning, clkBatteryLow, clkFrontViewLeftSideHigh, clkBlackTurn,clkWhiteTurn;
intclkSecWhite, clkSecBlack;
publicrdgtSnapshot(rdgtChessboard _board) {
time = newDate();
board =_board;
set_emptyboard();
}
publicrdgtSnapshot(rdgtSnapshot x) {
for (int i=0;i
time = x.time;
board =x.board;
clkRunning =x.clkRunning;
clkBatteryLow= x.clkBatteryLow;
clkFrontViewLeftSideHigh= x.clkFrontViewLeftSideHigh;
clkBlackTurn =x.clkBlackTurn;
clkWhiteTurn =x.clkWhiteTurn;
clkSecWhite =x.clkSecWhite;
clkSecBlack =x.clkSecBlack;
}
rdgtSnapshotcopy() {
return newrdgtSnapshot(this);
}
voidset_clockdata(boolean running, boolean batteryLow, booleanfrontViewLeftSideHigh,
booleanblackTurn, boolean whiteTurn, int secW, int secB) {
clkRunning =running;
clkBatteryLow= batteryLow;
clkFrontViewLeftSideHigh= frontViewLeftSideHigh;
clkBlackTurn =blackTurn;
clkWhiteTurn =whiteTurn;
clkSecWhite =secW;
clkSecBlack =secB;
}
public booleansameas(rdgtSnapshot x) {
for (int i=0;i
return true;
}
Dateget_time() { return time; }
voidset_emptyboard() {
time = newDate();
for (int i=0;i
}
voidset_boarddump(int[] all64, int startpos) {
time = newDate();
for (int i=0;i
int p =all64[i+startpos];
if(is_piece(p)==false) {
System.out.println(«Confused:Boarddump contained an unknown piece»);
pieces[i]=EMPTY;
} else {
pieces[i]=p;
}
}
}
voidset_fieldupdate(int piece, int pos) {
time = newDate();
if (pos 63) {
System.out.println(«Confused:Fieldupdate for pos outside 0..63»);
return;
}
if(is_piece(piece)==false) {
System.out.println(«Confused:Fieldupdate with an unknown piece»);
return;
}
pieces[pos]=piece;
}
Stringseconds2hms(int s) {
returnInteger.toString(s/36000)+Integer.toString((s%36000)/3600)+":"+
Integer.toString((s%3600)/600)+Integer.toString((s%360)/60)+":"+
Integer.toString((s%60)/10)+Integer.toString(s%10);
}
Stringdebugprint_clock() {
StringBuffer s= new StringBuffer(50);
s.append(«Clock:White „); s.append(seconds2hms(clkSecWhite));
s.append(“Black „); s.append(seconds2hms(clkSecBlack));
System.out.println(s);
 returns.toString();
}
StringgetTimeWhite(){
returnseconds2hms(clkSecWhite);
}
StringgetTimeBlack(){
returnseconds2hms(clkSecBlack);
}
booleanisWhiteTurn(){
returnclkFrontViewLeftSideHigh;
}
Stringdebugprint() {
debugprint_clock();
StringBuffer s= new StringBuffer(300);
for (int i=0;i
for (int j=0;j
int p =pieces[(i*8)+j];
if (p==EMPTY )s.append(“.»);
if (p==WPAWN )s.append(«P»);
if (p==WROOK )s.append(«R»);
if(p==WKNIGHT) s.append(«N»);
if(p==WBISHOP) s.append(«B»);
if (p==WKING )s.append(«K»);
if (p==WQUEEN) s.append(«Q»);
if (p==BPAWN )s.append(«p»);
if (p==BROOK )s.append(«r»);
if(p==BKNIGHT) s.append(«n»);
if(p==BBISHOP) s.append(«b»);
if (p==BKING )s.append(«k»);
if (p==BQUEEN) s.append(«q»);
}
s.append("\n");
}
System.out.println(s);
 returns.toString();
}
}

Приложение Д
Снимки экрана
Д.1 Снимок экрана главнойстраницы сервера трансляции шахматных партий rDGT
/> 
Д.2 Снимок экрана страницыавторизации пользователя
/>
Д.3 Снимок экрана страницыпросмотра текущих online трансляций
/>
Д.4 Снимок экрана страницыпросмотра шахматной партии
/>

Приложение Е
Протокол DGT
#ifndefdgtbrd13
#definedgtbrd13
/*
Protocoldescription for DGT chess board.
Copyright 1998DGT Projects B.V
Version: 1.03Single computer and bus support in one .h file
*********************************************************
This protocolis protected under trade mark registration and copyrights.
It may not beused commercially without written permission
of DGTProjects B.V. It is illegal to transfer any registered trade mark
identificationsby means of this protocol between any chessboard or other
applicationand any computer.
*********************************************************
Mainfunctionality of the DGT Electronic Chess Board
----------------------------------------------------
The DGT boardis basically a sensor which senses the presense of the special
chess set pieceson the squares of the board. The situation on the board is
measured andcan be communicated with an average maximum time delay of
200 mS.
Besides thisdetection function, the board communicates with an optional
DGT TopMatchChess Clock, to give the data of the clock available to the
generalinterface.
Finally theboard is equipped with an internal storage of the measured
piecepositions.
The boardsupports two methods of communication: for single-board situations
a protocol forcommunication between one board and one computer is available.
For situationswith many boards a network communications protocol is
available,where many boards can be connected in a bus structure. A separate
communicationprotocol is available for this bus structure.
The communicationprotocol for single board connections is described
in thefollowing paragraph «Single board communication protocol». This
paragraphdescribes much more than only the communication protocol. All
developersshould read this paragraph, even if they would only use bus
communication.
The specialbus communication protocol is derived from the single board
communicationand functionality, where the main added feature is the
possibility toaddress a specific board on a shared communication bus.
The commandsand data contens are described in the paragraph «Bus
CommunicationProtocol», Note however that the contens can not be understood
withoutreading the single board communication paragraph.
Paragraph:Single board communication protocol
----------------------------------------------
The mainfunction of the board is to transfer piece position information.
For this,three modes are available:
1. IDLE mode.This cancelles any of the two UPDATE modes. No automatic
transfer ofmoves.
2. UPDATE_BOARDmode. On the moment that the board detects a removal, change
or placing ofa piece, it outputs a DGT_SEND_UPDATE message
3. UPDATEmode. As UPDATE_BOARD mode, where additional the clock data are send
regularly (atleast every second)
The board acceptscommand codes from the computer RS232. The commands are
1-byte codes,sometimes followed by data (see code definition)
The board cansend data to the computer. Data always carries a message header.
The messageheader contains a message code and the total message size in bytes.
The start ofthe incoming message can be recognised by the MSB of the message
identifier setto 1 (see definition).
Board tocomputer communication interfaces:
RS232 forcommunication with computer, receiving commands, sending data
— 9600 Baud, 1stopbit, 1 startbit, no parity
— No use ofhandshaking, neither software nor hardware
Connectionbetween Digital Game Timer TopMatch Clock and the board:
Based on NECSBI protocol. Adaption of the definition given in
the DGTTopMatch documentation.
Connectorassignments for DGT Electronic Board: See User
andProgrammers Manual
Related to thebefore mentioned modes, and to piece position information
transfer, thefollowing commands to the board are available:
1.DGT_SEND_RESET
puts the DGTBoard in IDLE mode
2.DGT_SEND_CLK
on which theDGT board responds with a DGT_MSG_BWTIME message containing clock
information
3.DGT_SEND_BRD
on which theDGT Board responds with a DGT_MSG_BOARD_DUMP message containing
the actualpiece exising of all fields
4.DGT_SEND_UPDATE puts the DGT Board in the UPDATE mode, FRITZ5 compatible
5.DGT_SEND_UPDATE_BRD puts the DGT Board in the UPDATE_BOARD mode
6.DGT_SEND_UPDATE_NICE puts the board in UPDATE mode, however transferring onlyclocktimes when any time info changed.
TheDGT_SEND_CLK command and the DGT_SEND_BOARD command do not affect the currentboard
mode: i.e.when in UPDATE mode, it continues sending DGT_SEND_UPDATE messages.
BoardIdentification:
Each DGTElectronic Board carries a unique serial number,
a EEPROMconfiguration version number and a embedded program version number.
These data areunalterable by the users.
Currentidentification is:
«DGTProjects — This DGT board is produced by DGT Projects.\n
DGT Projectsis a registered trade mark.\n
220798ISP/bus/8KP/8KE/P6/Fritz5 Vs 1.00. Serial nr. 00137 1.0»
The board canbe loaded by the user with a non-volatile one-byte bus number,
for future usewith multiple board configurations.
On-boardEEPROM:
The boardcarries a 8 kB cyclic non-volatile memory, in which all position
changes andclock information is stored during all power-up time. This
file can beread and processed.
Start ofDefinitions:
---------------------*/
/* COMMANDCODES FROM PC TO BOARD: */
/* resultingin returning message(s): */
#defineDGT_SEND_CLK 0x41
/* results ina DGT_MSG_BWTIME message */
#defineDGT_SEND_BRD 0x42
/* results ina DGT_MSG_BOARD_DUMP message */
#defineDGT_SEND_UPDATE 0x43
/* results inDGT_MSG_FIELD_UPDATE messages and DGT_MSG_BWTIME messages
 as long asthe board is in UPDATE mode */
#defineDGT_SEND_UPDATE_BRD 0x44
/* results inDGT_MSG_FIELD_UPDATE messages
 as long asthe board is in UPDATE_BOARD mode */
#defineDGT_RETURN_SERIALNR 0x45
/* results ina DGT_MSG_SERIALNR message */
#defineDGT_RETURN_BUSADRES 0x46
/* results ina DGT_MSG_BUSADRES message */
#defineDGT_SEND_TRADEMARK 0x47
/* results ina DGT_MSG_TRADEMARK message */
#defineDGT_SEND_VERSION 0x4d
/* results ina DGT_MSG_VERSION message */
#defineDGT_SEND_UPDATE_NICE 0x4b
/* results inDGT_MSG_FIELD_UPDATE messages and DGT_MSG_BWTIME messages,
 the latteronly at time changes,
 as long asthe board is in UPDATE_NICE mode*/
#defineDGT_SEND_EE_MOVES 0x49
/* results ina DGT_MSG_EE_MOVES message */
/* notresulting in returning messages: */
#defineDGT_SEND_RESET 0x40
/* puts theboard in IDLE mode, cancelling any UPDATE mode */
/* DESCRIPTIONOF THE MESSAGES FROM BOARD TO PC
A messageconsists of three header bytes:
MESSAGE ID onebyte, MSB (MESSAGE BIT) always 1
MSB of MESSAGESIZE one byte, MSB always 0, carrying D13 to D7 of the total message length,including the 3 header byte
LSB of MESSAGESIZE one byte, MSB always 0, carrying D6 to D0 of the
 total messagelength, including the 3 header bytes
followed bythe data:
0 to ((2 EXP14) minus 3) data bytes, of which the MSB is always zero.
*/
/* DEFINITIONOF THE BOARD-TO-PC MESSAGE ID CODES and message descriptions */
/* the MessageID is the logical OR of MESSAGE_BIT and ID code */
#defineMESSAGE_BIT 0x80
/* ID codes:*/
#defineDGT_NONE 0x00
#defineDGT_BOARD_DUMP 0x06
#defineDGT_BWTIME 0x0d
#defineDGT_FIELD_UPDATE 0x0e
#defineDGT_EE_MOVES 0x0f
#defineDGT_BUSADRES 0x10
#defineDGT_SERIALNR 0x11
#defineDGT_TRADEMARK 0x12
#defineDGT_VERSION 0x13
/* Macros formessage length coding (to avoid MSB set to 1) */
#define BYTE char
#defineLLL_SEVEN(a) ((BYTE)(a&0x7f)) /* 0000 0000 0111 1111 */
#defineLLH_SEVEN(a) ((BYTE)((a & 0x3F80)>>7)) /* 0011 1111 1000 0000 */
/*DGT_MSG_BOARD_DUMP is the message that follows on a DGT_SEND_BOARD
 command */
#defineDGT_MSG_BOARD_DUMP (MESSAGE_BIT|DGT_BOARD_DUMP)
#defineDGT_SIZE_BOARD_DUMP 67
/* messageformat:
byte 0:DGT_MSG_BOARD_DUMP
byte 1:LLH_SEVEN(DGT_SIZE_BOARD_DUMP) (=0 fixed)
byte 2:LLL_SEVEN(DGT_SIZE_BOARD_DUMP) (=67 fixed)
byte 3-66:Pieces on position 0-63
Board fieldsare numbered from 0 to 63, row by row, in normal reading
sequence. Whenthe connector is on the left hand, counting starts at
the top leftsquare. The board itself does not rotate the numbering,
when blackinstead of white plays with the clock/connector on the left hand.
In non-rotatedboard use, the field numbering is as follows:
Field A8 isnumbered 0
Field B8 isnumbered 1
Field C8 isnumbered 2
..
Field A7 isnumbered 8
..
Field H1 isnumbered 63
So the boardalways numbers the black edge field closest to the connector
as 57.
Piece codes forchess pieces: */
#define EMPTY 0x00
#define WPAWN 0x01
#define WROOK 0x02
#defineWKNIGHT 0x03
#defineWBISHOP 0x04
#define WKING 0x05
#define WQUEEN0x06
#define BPAWN 0x07
#define BROOK 0x08
#defineBKNIGHT 0x09
#defineBBISHOP 0x0a
#define BKING 0x0b
#define BQUEEN0x0c
#define PIECE10x0d /* future use: pointing device in rest */
#define PIECE20x0e /* future use: pointing device right button */
#define PIECE30x0f /* future use: pointing device left button */
/* messageformat DGT_MSG_BWTIME */
#defineDGT_MSG_BWTIME (MESSAGE_BIT|DGT_BWTIME)
#defineDGT_SIZE_BWTIME 10
/*
byte 0:DGT_MSG_BWTIME
byte 1:LLH_SEVEN(DGT_SIZE_BWTIME) (=0 fixed)
byte 2:LLL_SEVEN(DGT_SIZE_BWTIME) (=10 fixed)
byte 3:
D4: 1 = Flagfallen for left player, and clock blocked to zero
0 = not theabove situation
D5: 1 = Timeper move indicator on for left player ( i.e. Bronstein, Fischer)
0 = Time permove indicator off for left player
D6: 1 = Leftplayers flag fallen and indicated on display
0 = not theabove situation
(D7 is MSB)
D0-D3: Hours(units, 0-9 Binary coded) white player (or player at the A side of the board)
byte 4:Minutes (0-59, BCD coded)
byte 5:Seconds (0-59, BCD coded)
byte 6-8: thesame for the other player
 
byte 9: Clockstatus byte: 7 bits
D0 (LSB): 1 =Clock running
0 = Clockstopped by Start/Stop
D1: 1 =tumbler position high on (white) player (front view: \, left side high)
0 = tumblerposition high on the other player (front view: /, right side high)
D2: 1 =Battery low indication on display
0 = no batterylow indication on display
D3: 1 = Blackplayers turn
0 = not blackplayers turn
D4: 1 = Whiteplayers turn
0 = not whiteplayers turn
D5: 1 = Noclock connected; reading invalid
0 = clockconnected, reading valid
D6: not used(read as 0)
D7: Always 0
The functionof the information bits are derived from the full information
as describedin the programmers reference manual for the DGT TopMatch
*/
/* messageformat DGT_MSG_FIELD_UPDATE: */
#defineDGT_MSG_FIELD_UPDATE (MESSAGE_BIT|DGT_FIELD_UPDATE)
#defineDGT_SIZE_FIELD_UPDATE 5
/*
byte 0:DGT_MSG_FIELD_UPDATE
byte 1:LLH_SEVEN(DGT_SIZE_FIELD_UPDATE) (=0 fixed)
byte 2:LLL_SEVEN(DGT_SIZE_FIELD_UPDATE) (=5 fixed)
byte 3: fieldnumber (0-63) which changed the piece code
byte 4: piececode including EMPTY, where a non-empty field became empty
*/
/* messageformat: DGT_MSG_TRADEMARK which returns a trade mark message */
#defineDGT_MSG_TRADEMARK (MESSAGE_BIT|DGT_TRADEMARK)
/*
byte 0:DGT_MSG_TRADEMARK
byte 1:LLH_SEVEN(DGT_SIZE_TRADEMARK)
byte 2:LLL_SEVEN(DGT_SIZE_TRADEMARK)
byte 3-end:ASCII TRADEMARK MESSAGE, codes 0 to 0x3F
The value ofDGT_SIZE_TRADEMARK is not known beforehand, and may be in the
range of 0 to256
Current trademark message: ...
*/
/* Message formatDGT_MSG_BUSADRES return message with bus adres */
#defineDGT_MSG_BUSADRES (MESSAGE_BIT|DGT_BUSADRES)
#defineDGT_SIZE_BUSADRES 5
/*
byte 0:DGT_MSG_BUSADRES
byte 1:LLH_SEVEN(DGT_SIZE_BUSADRES)
byte 2:LLL_SEVEN(DGT_SIZE_BUSADRES)
byte 3,4: Busadresin 2 bytes of 7 bits hexadecimal value
Byte 3: 0bbbbbbb with bus adres MSB 7 bits
byte 4: 0bbbbbbb with bus adres LSB 7 bits
The value ofthe 14-bit busadres is het hexadecimal representation
of the(decimal coded) serial number
i.e. When theserial number is «01025 1.0» the busadres will be
byte 3: 00001000 (0x08)
byte 4: 00000001 (0x01)
*/
/* Messageformat DGT_MSG_SERIALNR return message with bus adres */
#defineDGT_MSG_SERIALNR (MESSAGE_BIT|DGT_SERIALNR)
#defineDGT_SIZE_SERIALNR 12
/* returns 5ASCII decimal serial number + space + 3 byte version string: */
/* byte 0-5serial number string, sixth byte is LSByte */
/* byte 6:space */
/* byte 7-9:Internal storage version nr: format «1.0» */
/* Message formatDGT_MSG_EE_MOVES, which is the contens of the storage array */
/* Messageformat DGT_MSG_VERSION return message with bus adres */
#defineDGT_MSG_VERSION (MESSAGE_BIT|DGT_VERSION)
#defineDGT_SIZE_VERSION 5
/*
byte 0:DGT_MSG_VERSION
byte 1: LLH_SEVEN(DGT_SIZE_VERSION)
byte 2:LLL_SEVEN(DGT_SIZE_VERSION)
byte 3,4:Version in 2 bytes of 7 bits hexadecimal value
Byte 3: 0bbbbbbb with main version number MSB 7 bits
byte 4: 0bbbbbbb with sub version number LSB 7 bits
The value ofthe version is coded in binary
i.e. When thenumber is «1.02» the busadres will be
byte 3: 00000001 (0x01)
byte 4: 00000010 (0x02)
*/
#defineDGT_MSG_EE_MOVES (MESSAGE_BIT|DGT_EE_MOVES)
/*DGT_SIZE_EE_MOVES is defined in dgt_ee1.h: current (0x2000-0x100+3) */
/*
messageformat:
byte 0:DGT_MSG_EE_MOVES
byte 1:LLH_SEVEN(DGT_SIZE_EE_MOVES)
byte 2:LLL_SEVEN(DGT_SIZE_EE_MOVES)
byte 3-end:field change storage stream: See defines below for contens
TheDGT_MSG_EE_MOVES message contains the contens of the storage,
starting withthe oldest data, until the last written changes, and will
always endwith EE_EOF
*/
/*
Description ofthe EEPROM data storage and dump format
------------------------------------------------------
General: Theinternal EEPROM storage can be seen as a cyclic buffer with length
0x1f00 bytes,with one pointer, pointing to the last written byte in the buffer.
Only at thispointer location, data can be written, incrementing the pointer.
The writtendata always overwrites the oldest data.
In thisbuffer, sequentially messages are written. The messages are of various
length, from 1byte to 5 bytes, specific for every message.
Various eventsgenerate a message that is written in the storage, in the
sequence asthe events occur. When the buffer is downloaded and read, the event
messages canbe found, starting with the oldest event, and the latest event in
the end of thebuffer, followed by EE_EOF.
— At power-on,three tags EE_NOP are written, followed by a one-byte
EE_POWERUPmessage.
After this, anUPDATE_BOARD message is written (in virtually random sequence)
for everypiece that is found on the board, at power-on.
When the boardis equipped with a watchdog timer, and the watchdog times out,
anEE_WATCHDOG_ACTION is written and after that, the above described power-up
proceduretakes place.
— When at anytime a normal starting position for chess is found, with the
player forwhite having the board connector on his left hand, an EE_BEGINPOS tag
is written,and an EE_BEGINPOS_ROT tag is written when white has the
connector athis right hand (rotated)
— When 16chess figures are found on the board, all in the A, B, G and H row,
which arenot(!) in a normal chess starting position, the one-byte
EE_FOURROWSmessage is written, to be tolerant on erroneous placement and i.e. to be ableto play the «Random Chess» as proposed by Bobby
Fischer. Theexact position of the pieces has to be analyzed on the context: or found in theprevious piece move messages, or found in the
coming piecemove messages.
When an emptyboard is detected, the one-byte EE_EMPTYBOARD message is
written.
The abovedescribed detection of begin positions or empty-board has a certain
hysteresis:only after more than two pieces have been out of the begin
positions thesearch for begin positions is restarted, resulting in possibly
new tagwriting. This to avoid flushing the buffer full with data, only because
of one badpositioned and flashing piece.
When the dataof the internal storage are sent upon reception of the
DGT_SEND_EE_MOVEScommand, the one-byte EE_DOWNLOADED message is sent
On everydetected change of piece positions this change is written to EEPROM
in a 2-bytemessage, which cover exactly the same data as is sent to the PC
in theUPDATE_BOARD mode.
The formattingof the 2-byte piece update tag is:
First byte: 0t0rnnnn (n is piece code, see before)
(piece codeEMPTY when a piece is removed)
(t isrecognition bit, always 1)
(r isreserved)
so the firstbyte of this tag is always in the
range 0x40 to0x5f
Second byte: 00iiiiii (i = 0 to 63 (0x3f), the field number as
definedbefore)
NB: when onepiece only is changing, the new value is overwrites the
piece updatefield described above, instead of generating a new message
in theinternal storage.
The same kindof optimization is included for begin-position tags:
a EE_BEGINPOSor EE_BEGINPOS_ROT or EE_FOURROWS is not written, when
between theprevious written tags and the new occurence of the begin-
situation only2 or 1 piece were out of the tagged beginsituation.
On thepressing of the clock, the time of the halted clock is written in
a timemessage. It might be that when the moves are done very fast, the
storage isskipped. Note: the two clock sides are identified only by
left and rightside of the clock: When the board is swapped, the clock
data are not(!) swapped.
The clock dataare written on tumbler position change, so at the beginning
of the game,the game starting times will be lost.
Format of athree-byte time message:
First byte: 0uufhhhh (f=1 for time in left clock screen, seen from the front)
( hhhh: hours,valued 0 to 9)
(uurecognition bits, both 1, so byte 0 has the
( value rangeof 0x60 to 0x69, or 0x70 to 0x79)
Second byte: 0MMMmmmm (MMM: Tens of minutes (range 0 to 5),
(mmmm: minuteunits, range 0 to 9)
Third byte: 0SSSssss (SSS: tens of seconds, range 0-5)
(ssss: secondsunits, range 0-9)
On therecognition of the first byte of a message: The above definitions
imply that thefirst byte of a message is always ranged
from 40-5f for a field change message, 60-69 or 70-79 for a time message,
and 6a to 6f, or 7a to 7f for a 1-byte message.
(all valueshexadecimal)
*/
/* Definitionof the one-byte EEPROM message codes */
#defineEE_POWERUP 0x6a
#define EE_EOF0x6b
#defineEE_FOURROWS 0x6c
#defineEE_EMPTYBOARD 0x6d
#defineEE_DOWNLOADED 0x6e
#defineEE_BEGINPOS 0x6f
#defineEE_BEGINPOS_ROT 0x7a
#defineEE_START_TAG 0x7b
#defineEE_WATCHDOG_ACTION 0x7c
#define EE_NOP0x7f
/* 7d and 7ereserved for future use*/
/*
Notes on thecommunication dynamics:
The squares ofthe board are sampled one by one, where a full scan takes
about 200-250ms. Due to this scan time, it can be, that a piece that is
moved fromsquare e.g. A2 to A3 can be seen on both squares, in the same
scan. On anext scan of course, the old position is not seen anymore.
When in UPDATEmode, this means, that the information on changes on the
squares cancome in opposite sequence: first the new occurence is reported,
then theclearing of the old position is sent.
When a piece Bon C4 is taken by piece A on B3, it can be that the following
changes arereported:
A on C4
Empty on B3
(and Empty onC4 is never seen)
An otherextreme situation can occur e.g. when a queen on C1 takes a pawn
on C4. Thereported changes can be (in sequence):
Empty on C4(the pawn is taken by one hand)
Queen on C2
Queen on C3
Empty on C1
Empty on C2
Queen on C4
Empty on C3
For writingsoftware it is important to take these dynamics into account.
Some effortneeds to be made to reconstruct the actual moves of the pieces.
See also theprogrammers and users manual
Paragraph: Buscommunication protocol
-------------------------------------
Differencensbetween busmode and single board mode:
* In bus mode,RS232 input and RS232 output are connected to all boards.
The RS232output of the board is configured as a pull-up driver: with a
pull-downresistor on the RS232 pull-up line. Now all boards receive all
commands fromthe computer, and can all send data to the computer.
* In singleboard mode the board has a small incoming commands
buffer (10bytes).
* The bus modehas only a one-command incoming commands buffer
* When enteredin single board mode, the board status always switches to IDLE:
changes arenot send automatically
Bus mode isdefault power up mode of the board. The board recognises
bus commandsfrom the start.
However,single board commands are recognised and answered.
The boardswitches to single board mode on the moment, a single board
command isrecognised. Switching back to bus mode is invoked by the
extra commandDGT_TO_BUSMODE or by sending a busmode command. (NB This
busmodecommand causing the swithing is not processed!)
For alldetailed hardware descriptions: call.
*/
/* one addedfuncton for swiching to busmode by command: */
#defineDGT_TO_BUSMODE 0x4a
/*
This is anaddition on the other single-board commands. This command is
recognised insingle-board mode. The RS232 output goes in
pull-up modeand bus commands are immediatly recognised hereafter.
Note that whenthe board is in single-board mode, and eventually a bus
mode commandis found, this command is not processed, but the board
switches tobus mode. The next (bus) command is processed regularly.*/
/* Bus modecommands: */
#defineDGT_BUS_SEND_CLK (0x01 | MESSAGE_BIT)
#defineDGT_BUS_SEND_BRD (0x02 | MESSAGE_BIT)
#defineDGT_BUS_SEND_CHANGES (0x03 | MESSAGE_BIT)
#defineDGT_BUS_REPEAT_CHANGES (0x04 | MESSAGE_BIT)
#defineDGT_BUS_SET_START_GAME (0x05 | MESSAGE_BIT)
#defineDGT_BUS_SEND_FROM_START (0x06 | MESSAGE_BIT)
#defineDGT_BUS_PING (0x07 | MESSAGE_BIT)
#defineDGT_BUS_END_BUSMODE (0x08 | MESSAGE_BIT)
#defineDGT_BUS_RESET (0x09 | MESSAGE_BIT)
#defineDGT_BUS_IGNORE_NEXT_BUS_PING (0x0a | MESSAGE_BIT)
#define DGT_BUS_SEND_VERSION(0x0b | MESSAGE_BIT)
// extrareturn headers for bus mode:
#defineDGT_MSG_BUS_BRD_DUMP (0x03 | MESSAGE_BIT)
#defineDGT_MSG_BUS_BWTIME (0x04 | MESSAGE_BIT)
#defineDGT_MSG_BUS_UPDATE (0x05 | MESSAGE_BIT)
#defineDGT_MSG_BUS_FROM_START (0x06 | MESSAGE_BIT)
#defineDGT_MSG_BUS_PING (0x07 | MESSAGE_BIT)
#defineDGT_MSG_BUS_START_GAME_WRITTEN (0x08 | MESSAGE_BIT)
#defineDGT_MSG_BUS_VERSION (0x09 | MESSAGE_BIT)
// extradefines for bus length info:
#defineDGT_SIZE_BUS_PING 6
#define DGT_SIZE_BUS_START_GAME_WRITTEN6
#defineDGT_SIZE_BUS_VERSION 8 // was 6 up to version 1.2
/* Definitionof different commands&data
All commandsDGT_BUS_xx have the following format:
byte 1:command, i.e. DGT_BUS_SEND_BDR (D7 always 1)
byte 2: MSB ofaddressed board (D7 always 0)
byte 3: LSB ofaddressed board (D7 always 0)
byte 4:checksum: this is the sum of all bytes from start of the message
upto the lastbyte before the checksum. (D7 always 0)
I.e. messagecode 0x81 0x10 0x06 will carry checksum byte 0x17
DGT_BUS_SEND_CLK
asks for clockinformation of addressed board.
Will result ina DGT_MSG_BUS_BWTIME message from the board.
DGT_BUS_SEND_BRD
asks for aboard dump of addressed board.
Will result ina DGT_MSG_BUS_BRD_DUMP message from the board.
DGT_BUS_SEND_CHANGES
asks for allstored information changes from the moment of the last
DGT_BUS_SEND_CHANGES.Will result in a DGT_MSG_BUS_UPDATE message from
the board.
In case thesedata do not arrive properly, the data can be asked again
with theDGT_BUS_REPEAT_CHANGES command.
DGT_BUS_REPEAT_CHANGES
Causes theboard to send last sent packet of changes again.
DGT_BUS_SET_START_GAME
sets anEE_START_TAG tag in the internal board changes buffer, for use in the
followingcommand DGT_BUS_SEND_FROM_START. After this EE_START_TAG the
positions ofthe pieces are all logged in the file.
The command isanswered with a DGT_MSG_BUS_START_GAME_WRITTEN message,
about 70 msec.after receipt of DGT_BUS_SET_START_GAME
DGT_BUS_SEND_FROM_START
causes theboard to send a DGT_MSG_BUS_FROM_START message, containing
all updateinformation starting with EE_START_TAG until the last registered
changes(excluding the moves that are to be sent with the DGT_BUS_SEND_CHANGES
command). Rememberthat after the EE_START_TAG all piece positions are written
in the eepromfile.
DGT_BUS_PING
causes theaddressed board to send a DGT_MSG_BUS_PING message.
NB: when theDGT_BUS_PING command is sent with board address 0 (zero )
all connectedboards will reply with a DGT_MSG_BUS_PING message, randomly
spread over a1100 msec. interval. This to avoid collision. For reliable
identificationof all connected boards, this process should be repeated
sometimes withchecking of checksums!
DGT_IGNORE_NEXT_BUS_PING
is used in theprocess of detecting connected boards on a bus. After this
command (whichitself sends a DGT_MSG_BUS_PING as handshake) the first
followingDGT_BUS_PING with address zero (!) is ignored. This command
can be used tosuppress response of already detected boards, and decreases
the chance ofbus collisions.
This commandresponds immediately with a DGT_MSG_BUS_PING.
DGT_BUS_END_BUSMODE
causes theboard to quit busmode, and go into single-connection mode.
Be careful notto use this command in a multiple board configuration!
NOTE: Anysingle-board command arriving during bus mode will
switch a boardto single-board mode and will be processed. When sent
with address 0the command is processed on all connected boards
DGT_BUS_RESET
forces apower-up reset procedure. NB: this procedure takes some seconds.
When sent withaddress 0 the command is processed on all conected boards
DEFINITION OFTHE MESSAGE DATA FORMATS FROM BOARD TO PC
-------------------------------------------------------
General: themessage format is:
byte 1:message type byte (MSB = 1)
byte 2:message length MSB (from byte 1 to checksum) (D7=0)
byte 3:message length LSB (containing D0 to D6 of the length (D7 = 0)
byte 4: boardaddress MSB (D7=0)
byte 5: boardaddress LSB (D7=0)

last byte:checksum. This is the sum of all byte values from byte 1 to
 the bytebefore this checksum. D7 is forced to 0
DGT_MSG_BUS_BRD_DUMP
the data areacontains the piece codes from field 1 to field 64, in format
identical asthe single board command
DGT_MSG_BUS_BWTIME
the data areacontains the clock time information, in format identical as
the singleboard command
DGT_MSG_BUS_UPDATE
the data areacontains a variable amount of change information, formatted
as describedin the DGT_DUMP_EEMOVES message
DGT_MSG_BUS_FROM_START
the data areacontains a variable amount of change information, formatted
as describedin the DGT_DUMP_EEMOVES message
DGT_MSG_BUS_PING
the data areais empty: a message of 6 bytes is returned.
DGT_MSG_BUS_START_GAME_WRITTEN
The sameformat as for DGT_MSG_BUS_PING
DGT_MSG_BUS_VERSION
The two databytes contain binary version number: first byte main number
second bytesub number.
Tips for usageof the bus mode:
A. Onconnection of power and starting of the communication process:
— Checkcommunication with addressed DGT_BUS_PING commands to all expected
 boards.
LOOP:
— SendDGT_BUS_IGNORE_NEXT_PING to all found boards
— Checkeventually extra boards or unknown board busnumbers by using
 aDGT_BUS_PING with address zero.
— Register thefound boards, and go to LOOP:, until no more boards are found
B. At thestart of an event: when all boards have pieces in starting
 position,send DGT_BUS_SET_START_GAME commands to all boards.
— Read fullclock times from all boards.
C. During agame: send DGT_BUS_SEND_CHANGES to all boards sequentially,
 once everyfew seconds. The returned data should logically match
 with theexpected piece positions. When any mismatch occurs: ask full
 position withDGT_BUS_SEND_BRD.
D. Whenprevious data are lost: send a DGT_BUS_SEND_FROM_START command
 which returnsthe full registered changes from the starting position.
On every sentmessage: The responce time at the board is within milliseconds
normally,except when the board is storing a measured change in the
internalEEPROM: Then the responce time can be up to 20 milliseconds.
So allow a time-outon sent messages of say 80 mS.
Checksumerrors: when a received checksum does not match, resend the command
except on theDGT_BUS_SEND_CHANGES: then the command DGT_BUS_REPEAT_CHANGES
should beused, to avoid discarding of the changes sent by the board.
On clock data:
— reading dataout of the clock and make them available
 forcommunication causes a delay of up to 1 second between clock display
 and receiveddata.
*/
#endif

Приложение Ж
Общая структуратранслятора шахматных партий
/>
Приложение З
Общая структурарегистратора шахматных партий
/>

Приложение И
Анализ результатовтестовых испытаний№ п/п Показатель
Абсолютный
количественный показатель Относительный количественный показатель в %
Степень соответствия условиям соревновательного процесса
(субъективная оценка главного арбитра соревнований) 1 Количество сбоев в работе СШПО в ходе всего сорев-новательного про-цесса – ПОЛНОСТЬЮ СООТВЕТСТВУЕТ 2 Количество вре-менных простоев в работе СШПО в ходе всего сорев-новательного про-цесса – ПОЛНОСТЬЮ СООТВЕТСТВУЕТ 3 Количество несоот-ветствий отобража-емого хода ходу, сделанному на ша-хматной доске 5 0,48 ПОЛНОСТЬЮ СООТВЕТСТВУЕТ 4 Количество вре-менных задержек в ходе отображения игрового процесса 1 0,01 ПОЛНОСТЬЮ СООТВЕТСТВУЕТ 5 Количество вре-менных задержек переноса шахмат-ных партий в элек-тронную форму 1 0,01 ПОЛНОСТЬЮ СООТВЕТСТВУЕТ
Директор СП «ШК» АмзоровА.М.
Главный арбитрсоревнований Федоров В.Н.

Приложение К
Листинг модуля вещанияшахматных партий
// Фигура
var Figure = {
create:function(color, type, vertical) {
functionfigure() {}
var self = newfigure();
self.id =color + type + vertical;
self.image =document.createElement('img');
self.image.src= get_image_path() + (color + type + '.gif').toLowerCase();
self.image.size= '8x8';
return self;
}
};
// Поле доски
var Field = {
create:function(vertical, horizontal) {
functionfield() {}
var self = newfield();
// Идентификатор поля,соответствует ячейке в таблице, являющейся шахматной доской
self.id =«field» + vertical + horizontal;
self.horizontal= horizontal;
self.vertical= vertical;
 self.cell =$(self.id);
 //
 functionv(letter) {
 letter =letter.toLowerCase();
 if(letter =='a') {
 return 1;
 }
 if(letter =='b') {
 return 2;
 }
 if(letter =='c') {
 return 3;
 }
 if(letter =='d') {
 return 4;
 }
 if(letter =='e') {
 return 5;
 }
 if(letter =='f') {
 return 6;
 }
 if(letter =='g') {
 return 7;
 }
 if(letter =='h') {
 return 8;
 }
 return 0;
 }
 var vv =v(self.vertical);
 var hh =parseInt(self.horizontal);
 functionisWhite(summa) {
 var is_white= (summa / 2) — (Math.floor(summa / 2)) == 0;
 //log(summa +' — ' + is_white);
 return!is_white;
 }
 
 self.cell.className= isWhite(vv + hh)? 'board_white_field': 'board_black_field';
 
 self.set_figure= function(figure) {
 if(figure ==null) {
 log('null in' + self.id);
 }
 self.delete_figure();
 self.cell.appendChild(figure.image);
 self.current_figure= figure;
 }
 self.init_figure= function(figure) {
 self.set_figure(figure);
 self.first_figure= figure;
 self.last_figure= figure;
 }
 self.delete_figure= function() {
 this.cell.innerHTML= "";
 }
 
 self.first_figure= null;
 self.current_figure= null;
 self.last_figure= null;
 return self;
 }
};
// Ход шахматной партии
var Move = {
 create:function() {
 functionmove() {}
 
 var self =new move();
 self.color ='';
 self.next =null;
 self.prev =null;
 self.number =0;
 self.field_from= null;
 self.field_to= null;
 self.figure =null;
 self.figure_dead= null;
 self.is_short_castling= false;
 self.is_long_castling= false;
 
 self.forward= function() {
 if(self.is_short_castling|| self.is_long_castling) {
 self.field_from[0].delete_figure();
 self.field_from[1].delete_figure();
 self.field_to[0].set_figure(self.figure[0]);
 self.field_to[1].set_figure(self.figure[1]);
 } else {
 self.field_from.delete_figure();
 self.field_to.set_figure(self.figure);
 }
 }
 return self;
}
};
var Chess = {
 version:«2.0»,
 refresh_delay: 2, // интервал временимежду обновлениями позиции в секундах
 repaint_delay: 0.5, //интервал времени между перерисовками позиции в секундах
 moves: '/main/game_moves/1',
 createBoard:function() {
 var board =Board.create();
 board.init();
 return board;
 },
 createField:function(vertical, horizontal) {
 var self =Field.create(vertical, horizontal);
 return self;
 },
 createFigure:function(color, type, vertical) {
 var self =Figure.create(color, type, vertical);
 return self;
 },
 createMove:function() {
 var self =Move.create();
 return self;
 }
};
// Шахматная доска
var Board = {
 create:function() {
 functionboard() { }
 
 var self =new board();
 
 self.white_number= 0;
 self.black_number= 0;
 self.first_move= null;
 self.current_move= null;
 self.last_move =null;
 // Могут быть состояния
 // listen — следить заходом партий, отображаются актуальные ходы
 // custom — наблюдательвыбрал произвольную позицию в партии и навигирует по партии свободно
 self.status = 'listen';
 self.fields =new Array(64);
 self.figures= new Array(32);
 self.all_moves= '';
 
 // Обновление позиции
 self.refresh =function() {
 function existsMove(color,annotation) {
 var move =getMove(color, annotation);
 var exists =move != "******" && move != "";
 
 returnexists;
 }
 
 functiongetMove(color, annotation) {
 var m =annotation.substring(color == 'w'? 0: 6, color == 'w'? 6: 12);
 return m;
 }
 
 functionisCastling(color, type, annotation) {
 var move =getMove(color, annotation);
 var castling= (type == 'short'? move.substring(0, 3) == 'O-O': move.substring(0, 5) =='O-O-O');
 
 returncastling;
 }
 
 functiongetField(is_short, is_long, target, color, annotation) {
 if(is_short|| is_long) {
 if(color =='w') {
 if(is_short){
 return newArray(self.fields[target == 'from'? 4: 6], self.fields[target == 'from'? 7:5]);
 }
 if(is_long) {
 return newArray(self.fields[target == 'from'? 4: 2], self.fields[target == 'from'? 0:3]);
 }
 }
 if(color =='b') {
 if(is_short){
 return newArray(self.fields[target == 'from'? 60: 62], self.fields[target == 'from'?63: 61]);
 }
 if(is_long) {
 return newArray(self.fields[target == 'from'? 60: 58], self.fields[target == 'from'?56: 59]);
 }
 }
 }
 
 var field =annotation.substring(color == 'w'? (target == 'from'? 1: 4): (target =='from'? 7: 10), color == 'w'? (target == 'from'? 3: 6): (target == 'from'? 9: 12));
 var v =field.substring(0, 1).toLowerCase();
 var h =field.substring(1, 2).toLowerCase();
 //log('getField:v ' + v + ' h: ' + h);
 var iField =(parseInt(h) — 1) * 8;
 //log('tmp '+ iField);
 if(v == 'b'){
 iField += 1;
 }
 if(v == 'c'){
 iField += 2;
 }
 if(v == 'd'){
 iField += 3;
 }
 if(v == 'e'){
 iField += 4;
 }
 if(v == 'f'){
 iField += 5;
 }
 if(v == 'g'){
 iField += 6;
 }
 if(v == 'h'){
 iField += 7;
 }
 //log('return' + iField);
 returnself.fields[iField];
 }
 
 functiongetFigure(is_short, is_long, target, color, field) {
 if(is_short|| is_long) {
 if(color =='w') {
 if(is_short){
 return newArray(self.figures[0], self.figures[7]);
 }
 if(is_long) {
 return newArray(self.figures[0], self.figures[6]);
 }
 }
 if(color =='b') {
 if(is_short){
 return newArray(self.figures[16], self.figures[23]);
 }
 if(is_long) {
 return newArray(self.figures[16], self.figures[22]);
 }
 }
 }
 
 if(target =='alive') {
 returnfield.last_figure;
 }
 
 if(target =='dead') {
 returnfield.last_figure;
 }
 }
 
 // Запрашиваемобновление позиции
 newAjax.Request(Chess.moves, {
 method: 'get',
 onSuccess:function(transport) {
 self.all_moves= transport.responseText;
 }
 });
 // Анализируем ходы партии
 var splits =self.all_moves.split('|');
 var moves =new Array();
 for(i = 0; i
 if(splits[i]!= null) {
 moves.push(splits[i
 }
 }
 // Количество полученныхходов
 var number =moves.length;
 var current_number = self.last_move== null? 1: self.last_move.number;
if(number ==current_number && self.last_move != null &&self.last_move.color == 'w') {
 varmove_annotation = moves[number — 1];
 
 if(move_annotation!= '' && existsMove('b', moves[number — 1])) {
 var move =Chess.createMove();
 
 move.is_short_castling= isCastling('b', 'short', move_annotation);
 move.is_long_castling= isCastling('b', 'long', move_annotation);
 move.field_from= getField(move.is_short_castling, move.is_long_castling, 'from', 'b',move_annotation);
 move.field_to= getField(move.is_short_castling, move.is_long_castling, 'to', 'b',move_annotation);
 move.figure =getFigure(move.is_short_castling, move.is_long_castling, 'alive', 'b',move.field_from);
 move.figure_dead= getFigure(false, false, 'dead', 'b', move.field_to);
 move.number =self.last_move != null? ('b' == 'w'? (self.last_move.number + 1):self.last_move.number): 1;
 move.color ='b';
 
 move.field_from.last_figure= null;
 move.field_to.last_figure= move.figure;
 
 move.prev =self.last_move;
 if(self.last_move!= null) {
 self.last_move.next= move;
 }
 self.last_move= move;
 
 self.changes= true;
 }
 }
 
 if(number> current_number) {
 var c = ['w','b'];
 for(var iMove= current_number; iMove
 for(var ic =0; ic
 varmove_annotation = moves[iMove — 1];
 if(existsMove(c[ic],move_annotation)) {
 var move =Chess.createMove();
 
 if(self.first_move== null) {
 self.first_move= move;
 }
 
 move.is_short_castling= isCastling(c[ic], 'short', move_annotation);
 move.is_long_castling= isCastling(c[ic], 'long', move_annotation);
 move.field_from= getField(move.is_short_castling, move.is_long_castling, 'from', c[ic],move_annotation);
 move.field_to= getField(move.is_short_castling, move.is_long_castling, 'to', c[ic],move_annotation);
 move.figure =getFigure(move.is_short_castling, move.is_long_castling, 'alive', c[ic],move.field_from);
 move.figure_dead= getFigure(move.is_short_castling, move.is_long_castling, 'dead', c[ic],move.field_to);
 move.number =self.last_move != null? (c[ic] == 'w'? (self.last_move.number + 1):self.last_move.number): 1;
 move.color =c[ic];
 
 var ff =move.field_from;
 var ft =move.field_to;
 var fg = move.figure;
 
 if(fg ==null) {
 continue;
 }
 
 move.field_from.last_figure= null;
 move.field_to.last_figure= move.figure;
 
 move.prev =self.last_move;
 if(self.last_move!= null) {
 self.last_move.next= move;
 }
 self.last_move= move;
 self.changes= true;
 }
 }
 }
 }
 }
 
 self.changes= false;
 // Перерисовка позиции
 self.repaint= function() {
 if(self.current_move== null) {
 if(self.first_move== null) {
 return;
 }
 self.current_move= self.first_move;
 }
 
 if(self.current_move.color== 'w' && self.white_number == self.current_move.number ||
 self.current_move.color== 'b' && self.black_number == self.current_move.number) {
 if(self.current_move.next!= null) {
 self.current_move= self.current_move.next;
 }
 return;
 }
 
 self.current_move.forward();
 
 if(self.current_move.color== 'w') {
 self.white_number++;
 }
 if(self.current_move.color== 'b') {
 self.black_number++;
 }
 if(self.current_move.next!= null) {
 self.current_move= self.current_move.next;
 }
}
// Инициализируем доску,создаем поля и фигуры
self.init =function() {
 var v = newArray(«A», «B», «C», «D»,«E», «F», «G», «H»);
 var f = newArray(«K», «Q», «B», «N»,«R», «P»);
 var c = newArray(«w», «b»);
 // Создаем представление доски — таблицу
 vartableBoard = document.createElement('table');
 tableBoard.border= 1;
 tableBoard.align= «center»;
 tableBoard.width= «512px»;
 var tableBody= document.createElement('tbody');
 tableBoard.appendChild(tableBody);
 var tableDiv= $('board');
 tableDiv.appendChild(tableBoard);
 var rows =new Array(document.createElement('tr'), document.createElement('tr'),document.createElement('tr'), document.createElement('tr'),
 document.createElement('tr'),document.createElement('tr'), document.createElement('tr'),document.createElement('tr'));
 for(var iRow= 7; iRow >= 0; iRow--) {
 tableBody.appendChild(rows[iRow]);
 }
 // создаем ячейки
 for(variVertical = 0; iVertical
 for(variHorizontal = 8; iHorizontal > 0; iHorizontal--) {
 var cell =document.createElement('td');
 cell.width ='64px';//(100 / 8).toString() + "%";
 cell.height =cell.width;
 cell.align ='center';
 cell.id =«field» + v[iVertical] + iHorizontal.toString();
 rows[iHorizontal- 1].appendChild(cell);
 }
 }
 // поля
 log('creatingfields ...');
 var iField =0;
 for(variHorizontal = 1; iHorizontal
 for(variVertical = 0; iVertical
 self.fields[iField]= Chess.createField(v[iVertical], iHorizontal.toString());
 iField++;
 }
 }
 log('creatingfigure ...');
 // фигуры
 self.figures[0]= Chess.createFigure(c[0], f[0], ''); // wk — 0
 self.figures[1]= Chess.createFigure(c[0], f[1], ''); // wq — 1
 self.figures[2]= Chess.createFigure(c[0], f[2], v[2]); // wbC — 2
 self.figures[3]= Chess.createFigure(c[0], f[2], v[5]); // wbF — 3
 self.figures[4]= Chess.createFigure(c[0], f[3], v[1]); // wnB — 4
 self.figures[5]= Chess.createFigure(c[0], f[3], v[6]); // wnG — 5
 self.figures[6]= Chess.createFigure(c[0], f[4], v[0]); // wrA — 6
 self.figures[7]= Chess.createFigure(c[0], f[4], v[7]); // wrH — 7
 self.figures[8]= Chess.createFigure(c[0], f[5], v[0]); // wpA — 8
 self.figures[9]= Chess.createFigure(c[0], f[5], v[1]); // wpB — 9
 self.figures[10]= Chess.createFigure(c[0], f[5], v[2]); // wpC — 10
 self.figures[11]= Chess.createFigure(c[0], f[5], v[3]); // wpD — 11
 self.figures[12]= Chess.createFigure(c[0], f[5], v[4]); // wpE — 12
 self.figures[13]= Chess.createFigure(c[0], f[5], v[5]); // wpF — 13
 self.figures[14]= Chess.createFigure(c[0], f[5], v[6]); // wpG — 14
 self.figures[15]= Chess.createFigure(c[0], f[5], v[7]); // wpH — 15
 
 self.figures[16]= Chess.createFigure(c[1], f[0], ''); // bk — 16
 self.figures[17]= Chess.createFigure(c[1], f[1], ''); // bq — 17
 self.figures[18]= Chess.createFigure(c[1], f[2], v[2]); // bbC — 18
 self.figures[19]= Chess.createFigure(c[1], f[2], v[5]); // bbF — 19
 self.figures[20]= Chess.createFigure(c[1], f[3], v[1]); // bnB — 20
 self.figures[21]= Chess.createFigure(c[1], f[3], v[6]); // bnG — 21
 self.figures[22]= Chess.createFigure(c[1], f[4], v[0]); // brA — 22
 self.figures[23]= Chess.createFigure(c[1], f[4], v[7]); // brH — 23
 self.figures[24]= Chess.createFigure(c[1], f[5], v[0]); // bpA — 24
 self.figures[25]= Chess.createFigure(c[1], f[5], v[1]); // bpB — 25
 self.figures[26]= Chess.createFigure(c[1], f[5], v[2]); // bpC — 26
 self.figures[27]= Chess.createFigure(c[1], f[5], v[3]); // bpD — 27
 self.figures[28]= Chess.createFigure(c[1], f[5], v[4]); // bpE — 28
 self.figures[29]= Chess.createFigure(c[1], f[5], v[5]); // bpF — 29
 self.figures[30]= Chess.createFigure(c[1], f[5], v[6]); // bpG — 30
 self.figures[31]= Chess.createFigure(c[1], f[5], v[7]); // bpH — 31
 
 // расставляем исходную позицию
 self.set_begin_position();
}
self.set_begin_position= function() {
 log('initializebegin position ...');
 self.fields[56].init_figure(self.figures[22]);
 self.fields[57].init_figure(self.figures[20]);
 self.fields[58].init_figure(self.figures[18]);
 self.fields[59].init_figure(self.figures[17]);
 self.fields[60].init_figure(self.figures[16]);
 self.fields[61].init_figure(self.figures[19]);
 self.fields[62].init_figure(self.figures[21]);
 self.fields[63].init_figure(self.figures[23]);
 self.fields[48].init_figure(self.figures[24]);
 self.fields[49].init_figure(self.figures[25]);
 self.fields[50].init_figure(self.figures[26]);
 self.fields[51].init_figure(self.figures[27]);
 self.fields[52].init_figure(self.figures[28]);
 self.fields[53].init_figure(self.figures[29]);
 self.fields[54].init_figure(self.figures[30]);
 self.fields[55].init_figure(self.figures[31]);
 
 self.fields[8].init_figure(self.figures[8]);
 self.fields[9].init_figure(self.figures[9]);
 self.fields[10].init_figure(self.figures[10]);
 self.fields[11].init_figure(self.figures[11]);
 self.fields[12].init_figure(self.figures[12]);
 self.fields[13].init_figure(self.figures[13]);
 self.fields[14].init_figure(self.figures[14]);
 self.fields[15].init_figure(self.figures[15]);
 self.fields[0].init_figure(self.figures[6]);
 self.fields[1].init_figure(self.figures[4]);
 self.fields[2].init_figure(self.figures[2]);
 self.fields[3].init_figure(self.figures[1]);
 self.fields[4].init_figure(self.figures[0]);
 self.fields[5].init_figure(self.figures[3]);
 self.fields[6].init_figure(self.figures[5]);
 self.fields[7].init_figure(self.figures[7]);
}
self.set_end_position= function() {
}
self.set_position= function(number, color) {
}
self.next_move= function() {
}
self.prev_move= function() {
}
return self;
}
};
var board =Chess.createBoard();
// Периодическое обновление позиции
newPeriodicalExecuter(board.refresh, Chess.refresh_delay);
// Периодическая перерисовка позиции
newPeriodicalExecuter(board.repaint, Chess.repaint_delay)


Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.

Сейчас смотрят :

Реферат 6 2 Мероприятия по обеспечению электробезопасности в цехе
Реферат Запорожская Сечь козацкое государство
Реферат Города и торговля IX XVIII вв
Реферат Социально-экономическое развитие пореформеной Росcии
Реферат Экономико-психологическая характеристика личности, эмоциональный компонент субъективного благополучия и особенности отношения к деньгам
Реферат The Concept Of Freedom During The Civil
Реферат Экономические аспекты предотвращения и ликвидации загрязнения
Реферат Оценка банковского риска. Определение оптимальной стратегии распределения свободных банковских ресурсов
Реферат Страховой рынок и участники страховых отношений
Реферат Акционерное Общество "Смоленское Акционерное Общество Макаронных Изделий"
Реферат Россия 1917 - 1922гг Распад цивилизованного конгломерата Характеристики процесса
Реферат Рынок финансовой информации
Реферат Планування рекламної діяльності підприємства
Реферат Социальные слои населения
Реферат Спецификации локальной шины персонального компьютера