План
Лабораторные
Задание А1. Системы контроля версий
Цель задания: ознакомление с системой контроля версий Git через TortoiseGit или GitHub for Windows.
Для выполнения задания необходимо:
0. Установить tortoiseGit https://code.google.com/p/tortoisegit/ и требуемые ему компоненты (Git for Windows)или установить программу GitHub for Windows: https://windows.github.com/
1. Зарегистрироваться на сайте github.com
2. Найти на сайте мой аккаунт x4m
3. Найти в нём репозитарий prog2015
4. Создать fork репозитария
5. В репозитарии создать ветку с названием, отличным от master
6. Переключиться в созданную ветку (switch)
7. Создать в рабочей папке файл со своим никнеймом и расширением txt в папке "List"
8. Закоммитить файл в созданную вами ветку
9. Слить созданную вами ветку с веткой master в репозитарии prog2015
10. Синхронизовать изменения с репозитарием на сайте (push)
11. Создать pull-request со сделанными вами изменениями в мой репозитарий
Информация относительно регистрации:
Вам не обязательно указывать свои личные данные (имя, фамилия, группа и т.п.)
Вы можете сдавать лабораторные под вашим никнеймом, соответствие будет установлено непосредственно перед экзаменом.
Для связи со мной проще всего использовать сервис vk.com по адресу http://vk.com/amborodin либо почту amborodin@acm.org
Все лабораторные сдаются исключительно через github.
Я не буду рассматривать ваши файлы, присланные электронной почтой.
Код лабораторных вы коммитите в форк репозитария prog2015, я просматриваю ваши изменения и отмечаю сданные лабораторные комментарием.
По возможности из комментариев буду переносить информацию в файлы, которые вы создаёте в работе А1.
Задание A2. Сбор данных
Цель: создание приложения сбора данных.
Вам нужно создать приложение, которое позволит пользователю хранить данные выбранной вами предметной области в файле.
Ваше приложение содержит главную форму, на которой располагаются средства управления и кнопки "Сохранить в файл" и "Загрузить из файла".
Данные сохраняются в формате XML при помощи механизма XML-сериализации.
Рекомендации по выбору предметной области:
Допустим, вы выбрали предметную область "Заполнение штрафа инспектором ГИБДД".
Тогда на вашей форме должен быть TextBox для ввода ФИО инспектора, ФИО нарушителя, описания нарушения и места нарушения.
Также должен быть TextBox с маской для ввода номера автомобиля. DateEdit для ввода даты. ListBox для ввода свидетелей и понятых (количество не известно заранее).
Ваша программа должна предусматривать возможность сохранить все эти данные в файл и считать их из файла.
Допустим, вы выбрали предметную область "Карта осмотра пациента врачём".
Тогда ваша программа будет собирать информацию о ФИО, СНИЛС, номере полиса и месте осмотра.
Также у вас будет лист с перечислением диагнозов и назначенного по поводу диагноза лечения (и то и другое строка).
Количество диагнозов заранее неизвестно.
Требование к выбранной предметной области:
0. В выбранной предметной области должна быть частица смысла из реального мира. Не надо собирать информацию о сепуляции сепулькариев.
1. Должны быть представлены разные типы данных: строки, целые числа, дробные числа, даты, перечисления, списки.
Но смысл важнее. Если в вашей предметной области нет дат и дробных чисел - так тому и быть.
2. Списки должны быть в каждой предметной области. Даже если в этом нет смысла.
Собираемые вами данные должны иметь динамически расширяемый набор чего-либо.
Инспектор ГИБДД должен получить возможность ввести миллион разных свидетелей.
Врач может ввести всю МКБ ВОЗ (классификацию болезней), при желании - по нескольку раз.
3. Использование примеров в качестве предметной области не допускается.
Задание А3. Печатные формы
Создание печатной формы.
В созданную вами программу в задании А2 нужно добавить возможность напечатать на принтере введённые пользователем данные.
Для этого нужно установить компоненты создания печатных форм DevExpress с сайта https://www.devexpress.com/. В этом задании вам понадобится только XtraPrinting.
На время установки DevExpress Visual Studio необходимо закрыть.
0. После установки компонента, откройте Solution вашей программы.
1. Создайте в проекте источник данных на основе вашего корневого класса данных.
2. Создайте в проекте новую печатную форму (XtraReport).
3. Выберите в качестве источника данных созданный ранее источник данных (шаг 1)
.
4. Дабавтье секцию строк (details band) для ваших динамических данных
.
5. Статические данные разместите в шапке отчёта (report header) и в подвале отчёта (report footer)
.
6. Создайте на главной форме кнопку с кодом вызова печатной формы
.
Задание B1. Заполнение базы данных
Данная лабораторная работа демонстрирует оперирование сущностями БД с применением Entity Framework 6.
0. Для выполнения данной лабораторной работы перенесите код, описывающий ваши классы данных в отдельный проект.
1. В этом проекте добавьте ссылки на EntityFramework 6.0(через nuget, также добавится ссылка на EntityFramework.SqlServer).
2. При необходимости, остальные требуемые библиотеки вам поможет подключить ReSharper.
3. Создайте секции настроек проекта (Settings) в свойствах проекта.
4. В файле app.config определите соединение с базой данных.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="Store" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=Store;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
5. Добавьте в корневой класс идентифицирующую информацию (id, дату заполнения, название).
Идентификаторы добавьте во все классы данных.
6. Создайте класс с описанием модели вашей базы данных.
public class StoreContext : DbContext
{
public StoreContext() : base("name=Store") { }
public DbSet<Product> Products { get; set; }
}
7. Добавьте в интерфейс: кнопку сохранения в БД и чтения из БД.
Кнопка сохранения в БД открывает диалог ввода названия, кнопка чтения из БД открывает список сохранённых корневых объектов данных.
8. Заполните БД данными и проверьте их наличие в физической СУБД через Server Explorer.
Задание B2. Отображение данных на WEB странице
0. Создайте проект веб-сайта на MVC 5.
1. Создайте контроллер для корневой сущности данных.
2. Создайте два представления: список и детали.
3. В представлении сущности отобразите всю информацию, включенную в ваш корневой класс данных.
4. В списке отобразите только идентифицирующую информацию и ссылку на страницу деталей сущности.
5. Проверьте, что при вводе новых данных в БД они отображаются на сайте без перезагрузки вебсайта.
Задание В3. Передача данных по сети
Необходимо добавить в программу возможность передачи данных в сеть, а так же их получения, посредством UDP Multicast вещания.
0. Добавьте в главную форму вашего приложения кнопку "Принять данные с соседней системы" и "Отправить данные на соседнюю систему"
(Названия можно придумать покороче, главное сохранить смысл).
1. При нажатии кнопки "принять данные" программа вступает в мультикаст-группу UDP и ожидает получения данных из сети.
2. При этом присутствует кнопка "Отмена получения", которая прекращает этот режим и возвращает программу в нормальное функционирование.
3. Кнопка "Передать данные" сериализует данные из формы и отправляет их в UDP мультикаст-группу.
4. При отправке данных возможностью получения пакета данных длинной более максимальной длинны UDP-датаграммы пренебречь.
Задание С1. Лес слов
Необходимо написать консольное приложение, которое находит "путь" между двумя словами, с использованием словаря.
"Путь" - это цепочка слов, каждое из которых отличается от соседних только одним редактированием (заменой буквы, вставкой, удалением, транспозицией).
Транспозиция - по желанию студента.
0. При старте программа загружает словарь английских слов (взят из TortoiseSVN, код загрузки предоставляется).
1. Программа запрашивает два слова - начало и конец "пути".
2. При отсутствии начала и конца цепочки в словаре программа завершается.
3. Программа измеряет время поиска и футпринт памяти по завершению (GC.TotalBytesCount без GC.Collect).
4. Программа не гарантирует обязательного нахождения кратчайшей цепочки, но стремится к нахождению не слишком длинных цепочек.
Задание С2. Соревнование ИИ
Для этого задания на лекции пишется оболочка для игры по определённым правилам.
Правила игры оглашаются непосредственно на лекции: все студенты должны быть в равных условиях.
Игра представляет собой пошаговую дуэль с несложными ходами.
Задача студента написать бота для игры.
На парах блоков C и D все боты играют поочерёдно со всеми ботами.
Автор AI победившего максимум противников получит приз.
AI бросивший Exception считается проигравшим.
Задание С3. ANTLR\PEG
В данном задании требуется создать человекочитаемый (более человекочитаемый чем XML) язык описания доменной модели данных, разработанной в секции А.
Применять можно PEG.js, тогда входной и выходной потоки реализуется в браузере.
Применять можно ANTLR (взять из nuget), тогда входной и выходной потоки реализуется в консольном приложении.
Задача парсера: преобразовать человекочитаемый язык в XML-описание, соответствующее формату программы сбора данных.
Задание D1. Цифровая фильтрация изображения
В этом задании нужно создать фильтр, который будет изменять фотографию определённым образом.
На лекции рассмотрена библиотека BitmapImager для низкоуровневой работы с растровым изображением.
Также на лекции рассмотрены следующие фильтры:
1. Медианный фильтр
2. Линейный оператор преобразования цвета
Необходимо придумать и реализовать собственное преобразование.
Задание D2. OpenGL с Tao Framework.
Необходимо создать программу визуализации предметной области.
Т.е. по набору данных, программа должна создать сцену-иконку для конкретного набора данных.
В результирующем приложении сцена должна вращаться вокруг своей оси.
Допустимо применение WebGL вместо OpenGL, также допустимо применение любых других технологий создания 3D сцен.
Задание D3. Звук с NAudio
Необходимо создать приложение - музыкальный инструмент.
В приложении должно быть некоторое количество кнопок, каждая и которых вызывает свой звуковой эффект.
В приложении должна быть возможность записи последовательности нажатий кнопок, а также времени их нажатий, чтобы полученную мелодию можно было воспроизвести позднее.
Задание Wildcard. Может быть выполнено вместо любого задания из блока D.
По согласованию, задание может быть выполнено вместо нескольких заданий блока D.
Суть задания: придумать и решить проблему.
Найдите проблему и решите её или придумайте проблему и решите её.
Примеры:
На земле высадились дружественные инопланетяне-андройды. Никто не понимает их язык. Но инопланетяне общаются только жестами. Вам нужно создать программу, которая позволит всем людям, которые поняли какое-либо их слово, занести это слово в словарь. Также у людей должна быть возможность ввести последовательность жестов и найти соответствующую ему семантическую единицу. Возможно, люди иногда ошибаются в понимании жестов, поэтому поиск должен быть нечётким.
Создайте программу для описания формы облаков.
Решите задание С1 в виде Quine.
Создайте программу, моделирующую двухподвес, а также программу, стабилизирующую этот двухподвес.
http://en.wikipedia.org/wiki/Double_pendulum
http://www.youtube.com/watch?v=B6vr1x6KDaY
Напишите DropBox для Azure.
Это примеры, само задание нужно придумать вам.
Лекции
Неделя 01[9 февраля 2015 г.] Занаятие AB Тема VCS+WP
Занятие состоит из двух частей:
1. В первой части рассматриваются системы контроля версий SVN и GIT.
Дле тестов создаётся локальный репозитарий SVN, в нём создаётся стандартная структура веток.
Рассматриваются операции
Commit, Update, Revert, Create Patch, Apply Patch, разрешение конфликтов.
Создание ветки, слияние веток, Forward integration и reverse integraion.
Рассматриваются общие концепци распределённых систем контроля версий.
На примере GitHub рассматривается клонирование репозитария, push и pull, создание и слияние веток, концепция git flow.
Базовые команды git в bash, настройки TortoiseGit.
2. Демонстрирование программирования на Windows Phone.
Это занятие призвано показать, что создание приложений - может быть относительно простым процессом.
Тема приложения выбирается совместно со студентами.
Варианты тем:
а. Приложении для регистраци непарвильной парковки и автоматической подачи заявления в ГИБ2Д.
а. Аркадная игр, например, змейка.
Важно создавать простое приложение, чтобы весь процесс можно было вместить в одну пару.
При получении приемлимого кода, возможна публикация в Marketplace и передача кода одному из студентов для сопровождения.
Неделя 01[9 февраля 2015 г.] Занаятие CD Тема ABI+CLS
На данном занятии освежаются знания об WinABI:
Целые беззнаковые типы
Дополнительный код знаковых целых чисел
Числа с плавающей запятой и эффекты FPU
Числа с десятичным порядком
Строки и StringBuilder
Класс DateTime
Также освежаются знания по основам ООП:
0. Ссылки на экземпляры класса
1. Статические и нестатические поля класса
2. Конструктор (и финализатор?), сборка мусора
3. Методы
4. Свойства
5. События?
6. Области видимости
7. Пространства имён
8. Инкапсуляция, полиморфизм, наследование
Неделя 02[16 февраля 2015 г.] Занаятие AB Тема DA+Serialization
На этом занятии разрабатывается приложение в соответствии с требованиями лабораторной работы А1.
Получившийся исходный код выкладывается в репозитарий prog2015.
Неделя 02[16 февраля 2015 г.] Занаятие CD Тема Generics, Collections, Interfaces
На занятии рассматривается обобщённое программирование через сравнение template`ов С++ и generic`ов C#.
В дполнение рассматривается Java с её type erasure.
В качестве Изучения обобщения пишутся частные реализации LinkedList и Map.
Рассматриваются коллекции List, Dictionary, Stack,Hashset.
Упоминается ковариация и контрвариация, in и out generic-аргументы.
Рассматриваются интерфейсы, реализуемые стандартными коллекциями: IEnumerable, IList, ICollection.
Интерфейс IDisposable.
Рассматриваются делегаты и замыкания.
Неделя 03[23 февраля 2015 г.] Занаятие AB Тема Reporting, Projects+Assemblies
На занятии реализуется лабораторная работа А2.
В дополнение рассматривается структура проекта и решения.
Упоминается MSBuild и структура проекта с точки зрения MSBuild.
Неделя 03[23 февраля 2015 г.] Занаятие CD Тема 3d party components
На занятии рассматриваются таблицы DevExpress, сводные таблицы, компоненты визуального редактирования данных.
Рассматриваются компоненты Infragistics и Teleric.
Неделя 04[2 марта 2015 г.] Занаятие AB Тема GDI,Forms,WPF,Cpp Interop
На занятии освежатся знания о очереди сообщений окна.
Создаётся приложение SplashScreen для демонстрации WinAPI.
Для демонстрации PInvoke создаётся приложение из C++ библиотеки и C# исполняемого файла.
Рассматривается код, генерируемый дизайнером WinForms. Создаётся динамическая разметка формы.
Рассматривает создание интерфейса с помощью XAML. Рассматривается подход MVVM.
Упоминается Silverlight, Windows Phone и WinRT.
Неделя 04[2 марта 2015 г.] Занаятие CD Тема Exceptions, Win proc types
Рассматриваются глубокие и ветвистые иерархии исключений.
Демонстрируется замедление выполнения кода при использовании исключений.
Упоминаются checked исключения Java.
Рассматривается NLog и (или?) log4net, стандартный механизм трассировки, управление им через свичи.
Рассматривается запись в EventLog.
Рассматривается различие между консольными приложениями, оконными приложениями и сервисами.
Рассматривается различие выполнения приложения и сервиса под различными аккаунтами: LOCAL SYSTEM, NETWORK SERVICE, User Identity.
Упоминаение CAS, ACL. И снова упоминание Silverlight и Flash.
Неделя 05[9 марта 2015 г.] Занаятие AB Тема RDBMS+ADO.NET
Выполняется лабораторная работа B1 с применением EntityFramwork 6.
Рассматривается ItelliTrace.
Рассматривается язык SQL.
Рассматривается класс DataTable и его взаимодействие с WinForm компонентами.
Неделя 05[9 марта 2015 г.] Занаятие CD Тема Indexes, NoSQL
Рассматривается язык SQL: DDL и DML.
Операции реляционной алгебры: проекция, фильтрация, картезианский продукт.
Рассматриваются операции соединения.
Рассматриваются операции агрегации.
Рассматриваются индексы СУБД.
Упоминаются многомерные индексы.
Рассматрвиается MongoDB и RavenDB.
Неделя 06[16 марта 2015 г.] Занаятие AB Тема HTTP MVC
Рассматривается протокол HTTP и идеи URI.
Рассматриваются коды HTTP.
Рассматривается проект-шаблон MVC.
Выполняется лабораторная B2.
Неделя 06[16 марта 2015 г.] Занаятие CD Тема HTML JS, Browser debugger+TDD
Рассматривается http://jsfiddle.net/
Рассматриваются простейшие конструкции HTML и CSS.
Рассматриваются идеи языка JavaScript.
Замыкания, хештаблицы, массивы, eval.
Прототипное наследование.
Рассматривается NUnit, интегрированный в Resharper.
Создаются тесты для тестирования B1 и B2.
Рассматривается оригинальная среда выполнения NUnit.
Неделя 07[23 марта 2015 г.] Занаятие AB Тема Sockets
Рассматривается модель OSI и реальная модель TCP\IP.
Упоминается ARPANET, ARP, DHCP, broadcast, multicast.
Рассматривается WireShark, рассматривается модель лицензионной безопасности ReSarper`а.
Выполняется задание B3.
Неделя 07[23 марта 2015 г.] Занаятие CD Тема Unsafe
Расматриваются структуры.
Рассматривается StructureLayout.
Рассматривается fix buffers, GC.KeepAlive, паттерн обработки неуправляемых ресурсов.
Рассматривается выделение памяти через VirtualAlloc и проводятся тесты производительности вычсилений на управляемом массиве и прямой адресации зафиксированной памяти.
Рассматривается Reflection: создаётся свой сериализатор.
Неделя 08[30 марта 2015 г.] Занаятие AB Тема Thread sync
Рассматриваются потоки.
Создаётся затратная операция и разделяется на количество потоков.
Измеряется производительность в условных единицах при выполнении на разном количестве потоков.
Демонстрируется работа SetProcessorAffinity(?)
Рассматривается конфликт использования ресурсов на примере инкрмента.
Рассматриваются атомарные CAS операции.
Рассматривается реализация неблокирующего связного листа.
Рассматривается частная реализация блокировки.
Рассматривается Monitor, SpinLock.
Демонстрируется Message Pumping.
Рассматривается lock и отличия в CLR 2.0 и 4.0.
Неделя 08[30 марта 2015 г.] Занаятие CD Тема Thread tools (TPL)
Создаётся частная реализация ThreadPool.
Рассматривается ThreadPool.
Упоминаются пулы SQL-соединений, идеи асинхронных оптимизаций и long polling.
Рассматриваются Task`и и их взаимодействие.
Рассматривается обработка ошибок Task`ов.
Упоминается различие в обработке ошибок .Net 4.0 и 4.5.
Упоминается async.
Неделя 09[6 апреля 2015 г.] Занаятие A Тема Collections, Linq
Рассматриваются методы расширения.
Упоминается эволюция компиляции статически типизированных языков, от загловочных файлов до методов расширения.
На примере расширения свойств и скобок оператора if демонстрируются нефункциональные атавизмы языков (материал понадобится в 11 лекции).
Содаётся частная реализация методов манипуляции данными.
Рассматриваются аналоги, присутствующие в коллекциях.
Рассматривается методы расширения класса Enumerable.
Упомиyается ParallelEnumerable.
Рассматривается интегрированный синтаксис Linq.
Ставится задача на C1.
Неделя 09[6 апреля 2015 г.] Занаятие B Тема DataStructures
Рассматривается поиск перебором, бинарный и тернарный поиск, поиск хеш-таблицей.
Рассматриваются вопросы многомерного индексирования.
Рассматривается фильтр Блума.
Рассматриваются алгоритмы на строках, н-грамное сравнение.
Упоминается криптография, идеи симметричного и ассиметричного шифрования, цифровой подписи, биткоин.
Упоминается Information Retrival и Machine Learning.
Рассматривается SVD++.
Неделя 10[13 апреля 2015 г.] Занаятие A Тема AI Shell
Создаётся оболочка для тестирования лабораторной C2.
Неделя 10[13 апреля 2015 г.] Занаятие B Тема AI Contest
Проводятся соревнования по лабораторной C2.
Неделя 11[20 апреля 2015 г.] Занаятие A Тема Parsers
Создаётся парсер формул средствами ANTLR и PEG.js.
Неделя 11[20 апреля 2015 г.] Занаятие B Тема JS, Ruby, F#, Swift
Рассматриваются идеи в языках программирования JS, F#, Haskell.
Рассматриваются особенности Swift?, Go.
Неделя 12[27 апреля 2015 г.] Занаятие A Тема Java
Рассматриваются ключевые отличия Java от C#.
Реализуется простое приложение для Android.
Неделя 12[27 апреля 2015 г.] Занаятие B Тема Resharper+Xamarin
Рассматривается базовый рефакторинг с применением RsSharper.
Признаки грязного кода.
Способы ускорения кодирования.
Вопросы комментирования, самодокументирования и xml-документирования.
Упоминается CodeRush и встроеные средства VS.
Рассматривается Xamarin Studio, пишется Hello World под MacOS (Linux?).
Неделя 13[4 мая 2015 г.] Занаятие A Тема CGI
Рассматривается восприятие цвета, цветовые модели, растровые и векторные технологии.
Упоминаются фракталы.
Выполняется подготовка к лабораторной D1.
Неделя 13[4 мая 2015 г.] Занаятие B Тема Patterns
Рассматриваются паттерны проектирвоания по Гамме (или лучше взять короткий список из Маконела) и рефакторинга по Кериевски.
Неделя 14[11 мая 2015 г.] Занаятие A Тема OpenGL
Рассматривается TAO framework при работе с OpenGL.
Пишется программа которая
1. Вращает треугольник
2. Вращает куб
3. Вращает морфинг куб-цилиндр-шар
Неделя 14[11 мая 2015 г.] Занаятие B Тема Reverse
Выбирается необфусцированный .net-компонент (DevExpress, SyncFusion или Actipro).
С применением DotPeek и ildasm\ilasm в нём выключается защита.
Неделя 15[18 мая 2015 г.] Занаятие A Тема Wave audio
С применением NAudio создаётся приложение которое пищит с управляемой частотой.
Выполняется подготовка к лабораторной D3.
Неделя 15[18 мая 2015 г.] Занаятие B Тема Kinect
Рассматриваются sample`ы Kinect SDK.
Реализуется программа аудиозаказа бутерброда (выбранной предметной области?).
Неделя 16[25 мая 2015 г.] Занаятие A Тема Teamplay
Выполняется командная игра "Госзаказ".
Студенты делятся на три группы.
Одна из трёх человек - Кастомеры (Кт).
Две другие группы (Пр) примерно равного состава содержат гендиректора.
ГД распределяет роли разработчика, аналитика, технического писателя и др.
ГД в праве уволить сотрудника во время работы или попытаться переманить чужого(?).
При старте игры становится известно, что заказчик собирается заказать софт оперделённого назначения.
ГД запускают свои команды на написание софта.
В это время Кт пишут формальные требования к софту и процедуру проведения конкурса. Процедруа сравнения должна учитывать качество, соответствие требованиям и цену софта.
Разработка длится час. По звершению часа должн быть документированный софт.
Кт передаёт требования и описание процедуры производителям, от них Пр получает документацию по разработанным системам.
Кт проверяют документацию на соответствие формальным требованиям в течении 20 минут.
В это время Пр доводят софт и подают секретные заявки с озвученной ценой за свой софт.
После этого Кт выполняет тестирование и назначает победителя.
Победитель получает фрагмент призового фонда, соответствующий назначенной ими цене. Остатки фонда передаются Кт.