python.hw 2013-2014

КН-101

strings
Дописать недостающий функционал к string1.py и string2.py
Требования:
• прохождение тестов [1+1]
• соответствие стиля PEP8 [1+1]

Статистика
Скачать страницу http://cs.usu.edu.ru/home и выполнить:

Подзадача 1 (обязательно)
• Вычислить общую статистику по именам [1]
либо
• Вычислить статистику по именам за каждый год [2]

Подзадача 2 (по желанию)
• Отдельная статистика для мальчиков, отдельная для девочек [2]

Подзадача 3 (обязательно)
• Скрипт должен удовлетворять PEP8 [1]

Философия
Проверить тезис: «из любой статьи на русской Википедии можно за несколько шагов перейти в статью „Философия“»

Написать скрипт philosophy.py <название_статьи>

Требования:
• urlopen, re
• Если можно перейти, выдать список переходов (иначе ничего не печатать) [1]
• Переходить в пределах ru.wikipedia.org, переходы выполнять только в статьи [1]
• Не ходить по страницам дважды, не зацикливаться [1]
• PEP8 [1]

Анализ логов
Скачать лог-файлы веб-сервера http://1drv.ms/1iS10Cs и построить любые 2 статистики [2]:

• Число заходов на веб-сервер за каждый день
• Число заходов на /home/<имя>/* (результат — «<имя>: число»)
• Сумма принятых байт веб-севером за каждый день
• Сумма отправленных байт веб-севером за каждый день
• Сумма времени обработки запросов за каждый день
• Среднее время обработки запроса за каждый день

Задача по желанию — построить дополнительно любые 2 статистики [2]:
• Гистограмма количества запросов по времени суток (результат — 24 строки)
• Гистограмма принятых+отправленных байт по времени суток (результат — 24 строки)
• Среднее время обработки запросов на /home/<имя>/* (результат — «<имя>: <число>)
• Число уникальных заходов на /home/<имя>/* (результат — «<имя>: число»)
• Придумать свою интересную (желательно ещё и полезную на практике) статистику, не указанную в списке, и её посчитать :)

Если при запуске указан ключ -r, упорядочить вывод по убыванию статистики; иначе упорядочить вывод по возрастанию поля [1].

Файлы для обработки указываются в опциях командной строки, обработать необходимо ВСЕ файлы из архива и ПРИНЕСТИ результат обработки.
Пример запуска: $ get-stat.py -r *.log

Формат файла веб-сервера: https://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/bea506fd-38bc-4850-a4fb-e3a0379d321f.mspx?mfr=true (раздел «IIS Log File Format (IIS 6.0)»)

Скрипт должен удовлетворять PEP8 [1].

Классы
Модифицировать анализатор логов с использованием классов.

Класс анализатора должен иметь методы:
• Дочитывание лога из файла
• Дочитывание произвольной строки
• Получение статистики (название функции — название статистики, аргумент функции — параметр)

Задачи:
• Оформить в виде отдельного класса [1]
• Кеш результатов [1]
• Тесты [1]
• Ленивость (по желанию) [1]
• PEP8 [1]

Слияние
Реализовать следующий генератор:
• вход — компаратор «<» и произвольное количество итераторов, которые возвращают монотонные последовательности
• результат — монотонное объединение

Применить генератор для склейки лог-файлов из предыдущих д/з в хронологическом порядке (необходимо будет написать свой компаратор)

Задачи:
• Реализовать генератор [1]
• Компаратор для логов [1]
• Тесты [1]
• PEP8 [1]

КН-102

strings
Написать реализацию string1.py и string2.py (ссылка).
Требования:
- файлы должны быть в кодировке UTF-8
- правильность (прохождение тестов) [1+1]
- соответствие стиля PEP8 [1+1]
* не использовать регулярные выражения :)
Отправлять на почту alexog(at)hackerdom(dot)ru
Дедлайн: 23:59 26.02.14

SVN: http://anytask.urgu.org/static/HowtoPassTask.pdf

statistics
Сохранить страницу http://cs.usu.edu.ru/home/ в файл с именем "home.htm", посчитать статистику:
- по именам за каждый год
- по двум последним буквам фамилий
Вывести полученную статистику в файл с именем "results.txt"
Требования:
- посчитана статистика по именам [2]
- посчитана статистика по последним буквам фамилий [1]
- соответствие стиля PEP8 [1]
* не использовать регулярные выражения
* присылать только файл с python-кодом
Дедлайн: 23:59 05.03.14

philosophy
Проверить тезис: «из любой статьи в Википедии можно за несколько шагов перейти в статью „Философия“»

Написать скрипт philosophy.py <название_статьи>

Требования:
• urlopen, re
• Если можно перейти, выдать список переходов (иначе ничего не печатать) [1]
• Переходить в пределах ru.wikipedia.org, переходы выполнять только в статьи [1]
• Не ходить по страницам дважды, не зацикливаться [1]
• PEP8 [1]
Дедлайн: 23:59 15.03.14

log_parser
# Файл больше 50 ГБ
# Скачать лог-файл веб-сервера http://yadi.sk/d/IhuLPuocKemsh.
Скачать лог-файл http://yadi.sk/d/-bsxzu3VL3VTy (он на 300 МБ в расжатом виде).
Написать парсер, который корректно работает с большими файлами (> оперативной памяти - можно убедиться, что программа это делает, скопировав содержимое файла необходимое число раз), и посчитать любые 2 статистики [2 * 2]:
• число заходов на /home/<имя>/* (результат — «<имя>: число»)
• сумма принятых байт веб-севером за каждый день
• среднее время обработки запроса за каждый день
• самый популярный браузер

* Парсер должен уметь выдавать справку по запуску
* Выбор считаемой статистики должен зависеть от ключа запуска парсера
* Декомпозиция (код должен быть разбит на функции)

Дедлайн: 23:59 26.03.14

classes
Переписать предыдущую задачу с использованием классов.

Класс должен иметь методы:
• дочитывание лога из файла
• дочитывание произвольной строки
• получение статистики

* Необходимо написать набор тестов для демонстрации работы программы

Дедлайн: 23:59 02.04.14

project_stats
Реализовать недостающую функциональность. Исходный файл: http://yadi.sk/d/6KDJuRJXLHQQ5
Дедлайн: 23:59 23.04.13

iter_merge
Задача необязательная, для получения доп. баллов. Эти баллы не влияют на максимальный балл по задачам.

Реализовать генератор, принимающий на вход 2 [2] или произвольное количество [3] итераторов, возвращающих монотонно неубывающие последовательности чисел. Генератор должен возвращать их объединение с сохранением свойства.

Тесты и декомпозиция [1]

Дедлайн: 23:59 23.04.13

ФТ-102

strings
Дописать код в файлах. [2]
Проверить на PEP8 [2]

статистика
Сохранить страницу http://cs.usu.edu.ru/home/ в файл с именем "home.html", посчитать статистику:
- по именам за каждый год [1]
- по фамилиям за все время [1]
- по первой букве Имени и Фамилии (ИФ) [+1] (доп балл)
Соответствие pep8 [2]

Записать полученную статистику в файл с именем "results.txt" [+1]
Обрабатывать ошибку отсутствия файла "home.html" (использовать try/except/finally) [+2]
Первый приславший [+1]

* не использовать регулярные выражения
* присылать только файл с python-кодом в оговоренном формате

философия
Проверить тезис: «из любой статьи на русской Википедии можно за несколько шагов перейти в статью „Философия“»

Написать скрипт dz3.philosophy.<Фамилия><Имя>.py <название_статьи>

Требования:
• urlopen, re, sys.args
• Если можно перейти, выдать список переходов (иначе вывести сообщение) [1]
• Переходить в пределах ru.wikipedia.org, переходы выполнять только в статьи (не переходить в каталоги и рубрики) [1]
• Не ходить по страницам дважды, не зацикливаться [1]
• PEP8 [1]

• Обрабатывать дополнительный аргумент "-s" для сохранения полученного "пути" в виде последовательности файлов 1.html, 2.html, ... , содержащих HTML контент статей (желательно без меню и лишних элементов - только контент статьи [+1]) [+1]
• Написать документацию и обрабатывать ошибки в ключах и аргументах [+1], обрабатывать ключи: -h, --help для вывода справки [+1].

log_parser
Задача заключается в написании консольной утилиты, которая по данному логу, согласно параметрам, выдает одну из статистик:
* самый популярный ресурс
* самый активный IP
* самый популярный браузер
* выполнить задание в ООП стиле (за основу можно взять пример с пары)
* человеко читаемый вывод

Логи: http://yadi.sk/d/qm8G35WT3GjGG

Требования:
- Человеко читаемый код [1]
- Хорошее разделение на функции [+1]
- Парсер должен корректно работать для больших файлов (больших чем объем оперативной памяти) [1]
- Кэширование (запоминание текущего состояния счетчиков и кол-во обработанных строк) [2]
- pep8 [2]
- выводить для "топ 10 часто подключающихся IP" количество запросов в час [+2]

КН-103

strings
Дописать недостающий функционал к string1.py и string2.py
Требования:
• прохождение тестов [1+1]

statistics1
Взять содержимое файла http://cs.usu.edu.ru/home/
выдать статистику по именам отдельно для каждого года

statistics2
по текстовому файлу для слов с длиной больше 5
составить словарик следующего вида:
{слово -> (count, hash(слово))}
где count - число сколько раз слово встречается в файле
hash(слово) - функция, значение - сумма значений кодов букв

философия
Проверить тезис: «из любой статьи в Википедии можно за несколько шагов перейти в статью „Философия“»

Написать скрипт philosophy.py <название_статьи>

Требования:
• urlopen, re, sys.argv
• Если можно перейти, выдать список переходов (иначе ничего не печатать) [1]
• Переходить в пределах ru.wikipedia.org, переходы выполнять только в статьи [1]
• Не ходить по страницам дважды, не зацикливаться [1]
• PEP8 [1]
Дедлайн: 23:59 25.03.14

matcher
по введенной строке с помощью регулярных выражений определить, является ли эта строка правильной в синтаксисе языка ABC (http://cs.usu.edu.ru/langs/ABC/)
ограничить вложенность (скобочных конструкций и др.)

log_parser
дается лог файл web-сервера. Задача заключается в написании
консольной утилиты, которая по данному логу, согласно параметрам, выдает одну
из статистик:
самый популярный ресурс
самый активный клиент
самый популярный браузер

Важно:
отдельные функции: для считывания параметров запуска (напрямую из sys.argv), для чтения данных из файла, для поиска одной статистики, второй статистики, третьей статистики...
тестирование на маленьком фрагменте
анализ лога, который не влезает в память

Усложнения:
оформление в виде класса с методами.
сделать LogParser ленивым (вычислять все статистики только когда запросили одну из них) и
кеширующим (результаты всех статистик запоминаются).
пересчет статистики при изменении файла - если файл увеличился, то дочитывается с прошлого места.

Линейный генератор
Написать генератор генераторов, сохраняющий линейный порядок.


Пр:
a = [1, 9, 33]
b = fib()

z = linear(a, b)
next(z), ... next(z) # 1, 1, 1, 2, 3, 5, 8, 9, 13, 21, 33, ...

Perl2Python

strings
Дописать недостающий функционал к strings1.py и strings2.py.
Требования:
- Прохождение тестов
- Стиль

cs_parser
Взять содержимое файла http://cs.usu.edu.ru/home/ и выдать некоторую статистику о студентах матмеха, например:
- самое распространённое имя за всё время
- самое за каждый год
- отсортированный список имён по частоте их встречи за всё время

philosophy
Написать скрипт для проверки гипотезы о том, что от любой страницы Wikipedia можно добраться до страницы "Философия". Разумеется скрипт не должен зацикливаться.

log_parser
Написать парсер логов в формате http://yadi.sk/d/qm8G35WT3GjGG
Парсер должен корректно работать для больших файлов
Должна быть декомпозиция(разбивка) по функциям
Парсер должен уметь считать статистику:
* самая медленная страница
* самая быстрая страница
* самая медленная страница в среднем
* самая популярная страница
* самый активный клиент
* самый популярный браузер
* самый активный клиент по дням

2 балла за обычную реализацию + 2 за классы

functional
Дописать недостающие функции к выданному файлу

ФТ-101

strings
Дописать недостающий функционал к strings1.py и strings2.py.
Требования:
- Прохождение тестов
- Стиль

cs_parser
Взять содержимое файла http://cs.usu.edu.ru/home/ и выдать некоторую статистику о студентах матмеха, например:
- самое распространённое имя за всё время
- самое за каждый год
- отсортированный список имён по частоте их встречи за всё время

philosophy
Написать скрипт для проверки гипотезы о том, что от любой страницы Wikipedia можно добраться до страницы "Философия". Разумеется скрипт не должен зацикливаться.

log_parser
Написать парсер логов в формате http://yadi.sk/d/qm8G35WT3GjGG
Парсер должен корректно работать для больших файлов
Должна быть декомпозиция(разбивка) по функциям
Парсер должен уметь считать статистику:
* самая медленная страница
* самая быстрая страница
* самая медленная страница в среднем
* самая популярная страница
* самый активный клиент
* самый популярный браузер
* самый активный клиент по дням

2 балла за обычную реализацию + 2 за классы

functional
Дописать недостающие функции к выданному файлу

КБ-101

strings
Дописать недостающий функционал к string1.py и string2.py
Требования:
• прохождение тестов [1+1]

cs_parser

philosophy
Проверить тезис: «из любой статьи в Википедии можно за несколько шагов перейти в статью „Философия“»

Написать скрипт philosophy.py <название_статьи>

Требования:
• urlopen, re
• Если можно перейти, выдать список переходов (иначе ничего не печатать) [1]
• Переходить в пределах ru.wikipedia.org, переходы выполнять только в статьи [1]
• Не ходить по страницам дважды, не зацикливаться [1]
• PEP8 [1]

ructf_datamining
Дан лог проверяющей системы RuCTF. Восстановить финальную таблицу результатов и намайнить что-нибудь интересное в них.

classes
Переписать предыдущую задачу с использованием классов

functional
Написать тела функций. Исходный файл: https://alexbers.com/python/hw5/project_source_stats_hw.py