Архив автора: admin

Видеолекции курса Языки программирования и компиляторы

Видеолекции курса Языки программирования и компиляторы.

Лектор: Дмитрий Булычев.

Литература по курсу:

  1. S.Muchnik. Advanced Compiler Design & Implementation. Academic Press, Morgan Kaufmann, 1998.
  2. А.Ахо, Р.Сети, С.Ульман. Компиляторы: принципы, технологии, инструменты. Вильямс, 2003.
  3. А.Ахо, С.Ульман. Теория синтаксического анализа, перевода и компиляции. Том 1. М., «Мир», 1978.
  4. F.Nielsen. Principles of Program Analysis. Springer, 2005.
  5. F.Nielse, H-R.Nielsen. Semantics with Applications. Wiley Professional Computing, 1992.
  6. B.Pierce. Types and Programming Languages. MIT Press, 2002.
  7. T.Пратт. Языки программирования: разработка и реализация. 1978.
  8. Б.К.Мартыненко. Языки и трансляции. Из-во СПбГУ, 2008.

Лекция 1. Введение.
Языки программирования, синтаксис, семантика, прагматика. Когнитивные особенности человеческого мышления и их влияние на развитие языков программирования. Языки программирования в ретроспективе. Процедурное, объектно-ориентированное, логическое и функциональное программирование. Предметно-ориентированные языки. Языки вне классификации. Абстрактный и конкретный синтаксис. Статическая и динамическая семантика.


Посмотреть видео на сайте Лекториума

Лекция 2.
Компиляция и интерпретация. Смешанные вычисления. Проекции Футамуры-Ершова.


Посмотреть видео на сайте Лекториума

Лекция 3. Операционная семантика большого шага.


Посмотреть видео на сайте Лекториума

Лекция 4. Операционная семантика малого шага.


Посмотреть видео на сайте Лекториума

Лекция 5.
Свойства семантик большого и малого шага. Структурная индукция. Эквивалентность семантик. Разная выразительная сила семантик большого и малого шагов.


Посмотреть видео на сайте Лекториума

Лекция 6.
Семантика параллельного исполнения. Основные определения лямбда-исчисления. Семантика произвольного и нормального порядка редукций.


Посмотреть видео на сайте Лекториума

Лекция 7.
Статическая семантика. Замкнутые программы; свободные программы. Неразрешимость проблемы свободы. Живые переменные и достигающие определения.


Посмотреть видео на сайте Лекториума

Лекция 8.
Элементарная типизация в виде статической семантики большого шага. Полурешетка типов, решение задачи типизации на основе достигающих определений.


Посмотреть видео на сайте Лекториума

Лекция 9.


Посмотреть видео на сайте Лекториума

Лекция 10.


Посмотреть видео на сайте Лекториума

Лекция 11.


Посмотреть видео на сайте Лекториума

Автор: Roman Brovko

Видеолекции курса Алгоритмы для NP-трудных задач

Видеолекции курса Алгоритмы для NP-трудных задач.

Лектор: Александр Куликов.

В курсе будет дан обзор идей и методов, использующихся при построении и анализе алгоритмов для NP-трудных задач. Несмотря на то что эффективных алгоритмов для таких задач до сих пор неизвестно, NP-трудные задачи часто возникают на практике. Мы рассмотрим приближённые алгоритмы (позволяющие эффективно находить решение, которое гарантированно не сильно хуже оптимального), точные алгоритмы с доказуемыми верхними оценками (которые более интересны с теоретической точки зрения) и эвристики (алгоритмы, хорошо работающие на практике, но не имеющие теоретических гарантий на время работы и ошибку приближения).

Отдельное внимание будет уделено открытым задачам данной области.

Курс предполагает знакомство слушателей лишь с базовыми алгоритмическими идеями.

Основная литература:

  • Книги:
    1. [FK10] Fedor V. Fomin and Dieter Kratsch. Exact Exponential Algorithms. Springer. 2010. [official]
    2. [V01] Vijay V. Vazirani. Approximation Algorithms. Springer. 2001. [official], [PDF]
    3. [WS11] David P. Williamson and David B. Shmoys. The Design of Approximation Algorithms. Cambridge University Press. 2011. [official], [PDF]
    4. [DPV06] Sanjoy Dasgupta, Christos Papadimitriou, Umesh Vazirani. Algorithms. McGraw-Hill. 2006. [official], [PDF]
    5. [CLR01] Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест. Алгоритмы: построение и анализ. Издательство МЦНМО. 2001.
  • Обзоры:
    1. [W03] Gerhard J. Woeginger. Exact algorithms for NP-hard problems: a survey. Combinatorial optimization — Eureka, you shrink! Springer. 2003. [official], [PDF]
    2. [FK13] Fedor V. Fomin, Petteri Kaski. Exact exponential algorithms. Communications of the ACM. 2013. [official], [PDF]
    3. [YWHL13] Dongxiao Yu, Yuexuan Wang, Qiang-Sheng Hua, Francis C.M. Lau. Faster and Space Efficient Exact Exponential Algorithms: Combinatorial and Algebraic Approaches. Handbook of Combinatorial Optimization, Springer. 2013, pp 1249-1291. [official], [PDF]
  • Lecture notes:
    1. [A09] AGAPE Spring School on Fixed Parameter and Exact Algorithms. [PDF]

Лекция 1. Введение.
Обзор курса, мотивация изучения приближённых и точных экспоненциальных алгоритмов.


Посмотреть видео на сайте Лекториума

Лекция 2. NP-полные задачи.

Задачи поиска, сведения, доказательство NP-полноты задач выполнимости, 3-выполнимости, задачи о независимом множестве, задачи о вершинном покрытии.

Литература: [DPV06, глава 8].


Посмотреть видео на сайте Лекториума

Лекция 3. Точные алгоритмы для задачи коммивояжёра и задачи о гамильтоновом цикле.

Метод динамического программирования (время: $ O^*(2^n) $, память: $ O^*(2^n) $). [DPV06, глава 6]

Метод включений-исключений (время: $ O^*(2^n) $, память: $ O^*(1) $). [FK10, глава 4]

Матрица Татта и перманент, решение для двудольного графа за $ O^*(2^{n/2}) $ времени и $ O^*(1) $ памяти. [Andreas Bjorklund. Determinant Sums for Undirected Hamiltonicity. FOCS 2010. [official], [PDF]], [Beating A Forty Year Old Result: Hamilton Cycles] [FK13]


Посмотреть видео на сайте Лекториума

Лекция 4. Приближённые алгоритмы для задачи коммивояжёра.

Лемма Шварца-Зиппеля. [
wikipedia]

Приближённые алгоритмы: 1.5-приближённый алгоритм для задачи коммивояжёра в метрическом пространстве, неприближаемость общего случая, 0.5-приближение для максимизационного варианта. [CLR01, V01]


Посмотреть видео на сайте Лекториума

Лекция 5. Приближённые алгоритмы для задачи коммивояжёра (продолжение).

2/3-приближение для максимального цикла коммивояжера в ориентированном графе. [Katarzyna E. Paluch, Khaled M. Elbassioni, Anke van Zuylen: Simpler Approximation of the Maximum Asymmetric Traveling Salesman Problem. STACS 2012: 501-506. PDF]

Эвристики: метод локального поиска и метод ветвей и границ. [DPV06]

Лекция 6. Точные алгоритмы для задачи о максимальном разрезе и задачи максимальной 2-выполнимости.
Точные алгоритмы со временем работы $ O^*(2^{omega n/3}) $ и памятью $ O^*(2^{2n/3}) $. [Ryan Williams. Algorithms and Resource Requirements for Fundamental Problems. PhD thesis, 2007. PDF] [W03] [FK13]


Посмотреть видео на сайте Лекториума

Лекция 7. Эвристики для задачи коммивояжёра, алгоритмы для задачи о надстроке.

Эвристики для задачи коммивояжёра: метод ветвей и границ, локальный поиск. [DPV, глава 9], [пост Ричарда Липтона: Branch And Bound—Why Does It Work?]

Алгоритмы для задачи о надстроке: точный алгоритм со временем работы $ O^*(2^n) $ и полиномиальной памятью, жадная гипотеза.


Посмотреть видео на сайте Лекториума

Лекция 8. Точные алгоритмы для задачи раскраски графа.

3-раскраска: время $ O^*(2^n) $ и полиномиальная память с помощью перебора, улучшение до $ O^*(1.9^n) $; вероятностный $ O^*(1.5^n) $ алгоритм через сведение к задаче 2-выполнимости; $ O^*(1.45^n) $ через использование максимальных по включению независимых множеств. Общая задача: время $ O^*(3^n) $ и память $ O^*(2^n) $ через динамическое программирование, улучшение до $ O^*(2.45^n) $ через максимальные по включению независимые множества; время и память $ O^*(2^n) $ через формулу включений-исключений и быстрое преобразование Фурье. [Thore Husfeldt, Graph colouring algorithms]


Посмотреть видео на сайте Лекториума

Лекция 9. Алгоритмы для задачи выполнимости: локальный поиск.

Локальный поиск: поиск выполняющего набора в шаре радиуса $ r $ за $ O^*(3^r) $; оценки $ O^*(3^{n/2}) $ и $ O^*(1.5^n) $ с помощью покрытия шарами радиуса $ n/2 $ и $ n/4 $.

Литература:
Uwe Schöning: A Probabilistic Algorithm for $ k $-SAT and Constraint Satisfaction Problems. FOCS 1999: 410-414. [official, PDF]
Evgeny Dantsin, Andreas Goerdt, Edward A. Hirsch, Ravi Kannan, Jon M. Kleinberg, Christos H. Papadimitriou, Prabhakar Raghavan, Uwe Schöning: A deterministic $ (2-2/(k+1))^n $ algorithm for $ k $-SAT based on local search. Theor. Comput. Sci. 289(1): 69-83 (2002). [official, PS]


Посмотреть видео на сайте Лекториума

Лекция 10. Алгоритмы для задачи выполнимости: метод расщепления.

DPLL-алгоритмы, основные идеи метода расщепления, вектор и число расщепления. $ O^*(2^{2n/3}) $ для задачи 3-выполнимости одновыполнимой формулы через расщепление относительно случайной перестановки. Запоминание дизъюнктов: решение задачи выполнимости на формулах константной плотности за $ O^*((2-c)^n) $. Комбинированные меры сложности, measure and conquer: $ O^*(2^{m/5.5}) $для задачи максимальной 2-выполнимости.

Литература:
Timon Hertli: 3-SAT Faster and Simpler — Unique-SAT Bounds for PPSZ Hold in General. FOCS 2011: 277-284
Ramamohan Paturi, Pavel Pudlák, Michael E. Saks, Francis Zane: An improved exponential-time algorithm for k-SAT. J. ACM 52(3): 337-364 (2005)
Alexander S. Kulikov, Konstantin Kutzkov: New Bounds for MAX-SAT by Clause Learning. CSR 2007: 194-204
Arist Kojevnikov, Alexander S. Kulikov: A new approach to proving upper bounds for MAX-2-SAT. SODA 2006: 11-17


Посмотреть видео на сайте Лекториума

Лекция 11. Приближённые алгоритмы.

2-приближённый алгоритм для задачи о вершинном покрытии через максимальное по включению паросочетание, 2-приближение для взвешенного случая через линейное программирование. Жадный $ log n $-приближённый алгоритм для задачи о покрытии множествами. $ log n $-приближённый алгоритм для задачи о множестве представителей через линейное программирование и вероятностное округление.


Посмотреть видео на сайте Лекториума

Лекция 12. Приближённые алгоритмы (продолжение).

4-приближённый алгоритм для задачи о кратчайшей общей надстроке через покрытие циклами.

0.878-приближённый алгоритм для задачи о максимальном разрезе через полуопределённое программирование и вероятностное округление.


Посмотреть видео на сайте Лекториума

Автор: Roman Brovko

Видеолекции курса Алгоритмы и структуры данных. Часть 2

Видеолекции курса Алгоритмы и структуры данных. Часть 2.

Лекторы: Александр Куликов, Михаил Дворкин.


Лекция 1. Пути в графах.
Кратчайшие пути при наличии рёбер отрицательного веса: алгоритм Беллмана-Форда; определение наличия цикла отрицательного веса в графе. Кратчайшие пути в ациклических ориентированных графах. Кратчайшие пути между всеми парами вершин: алгоритм Флойда-Уоршолла, алгоритм Джонсона.


Посмотреть видео на сайте Лекториума

Лекция 2. Жадные алгоритмы.
Общие принципы жадного метода. Непрерывная и дискретная задачи о рюкзаке. Задача о выборе заявок. Минимальное покрывающее дерево: свойство разреза, жадная стратегия.


Посмотреть видео на сайте Лекториума

Лекция 3. Алгоритм Крускала, система непересекающихся множеств.
Алгоритм Крускала, система непересекающихся множеств.


Посмотреть видео на сайте Лекториума

Семинар 1. Алгоритм Прима.


Посмотреть видео на сайте Лекториума

Семинар 2.


Посмотреть видео на сайте Лекториума

Семинар 3.


Посмотреть видео на сайте Лекториума

Лекция 4. Числовые алгоритмы.
Система непересекающихся множеств: доказательство оценки на время работы алгоритма с эвристикой сжатия путей. Числовые алгоритмы. Основные арифметические операции: сложение, умножение, деление, нахождение наибольшего общего делителя.


Посмотреть видео на сайте Лекториума

Семинар 4.


Посмотреть видео на сайте Лекториума

Лекция 5. Проверка простоты числа.
Арифметика сравнений: сложение, умножение, возведение в степень, нахождение обратного по модулю. Вероятностный тест на простоту.


Посмотреть видео на сайте Лекториума

Семинар 5.


Посмотреть видео на сайте Лекториума

Лекция 6. RSA.
Генерация случайных простых чисел. Криптография: схемы с закрытым ключом, RSA.


Посмотреть видео на сайте Лекториума

Семинар 6.


Посмотреть видео на сайте Лекториума

Лекция 7. Быстрое преобразование Фурье.
Быстрое вычисление значений многочлена в точках: два способа задания многочленов — коэффициентами и значениями в точках; вычисление значений многочлена в точках методом «разделяй и властвуй»; дискретное преобразование Фурье; быстрое преобразование Фурье. Интерполяция: интерполяция в терминах матриц; матрица Вандермонда; интерполяция как домножение на обратную матрицу.


Посмотреть видео на сайте Лекториума

Семинар 7.


Посмотреть видео на сайте Лекториума

Лекция 8. Линейное программирование.
Линейное программирование: общий вид задачи, двойственность. Задача о макси
мальном потоке. Задача о паросочетании в двудольном графе.


Посмотреть видео на сайте Лекториума

Семинар 8.


Посмотреть видео на сайте Лекториума

Лекция 9. Симплекс-метод.
Подробнее о двойственности, симплекс-метод.


Посмотреть видео на сайте Лекториума

Семинар 9.


Посмотреть видео на сайте Лекториума

Лекция 10. Алгоритм Кнута-Морриса-Пратта.
Задача поиска подстроки в строке. Наивный алгоритм, алгоритм Карпа-Рабина, алгоритм Кнута-Морриса-Пратта.


Посмотреть видео на сайте Лекториума

Семинар 10.


Посмотреть видео на сайте Лекториума

Лекция 11. Суффиксные деревья.
Построение суффиксного дерева за линейное время.


Посмотреть видео на сайте Лекториума

Семинар 11.


Посмотреть видео на сайте Лекториума

Лекция 12. NP-полные задачи.
Задачи поиска, классы P и NP. Сведения. Доказательство NP-полноты задач выполнимости, 3-выполнимости, выполнимости схемы, задачи о независимом множестве.


Посмотреть видео на сайте Лекториума

Семинар 12.


Посмотреть видео на сайте Лекториума

Автор: Roman Brovko

Видеолекции курса Алгоритмы и структуры данных. Часть 1

Видеолекции курса Алгоритмы и структуры данных. Часть 1.

Лектор: Александр Куликов.


Лекция 1. Введение.
Вычисление чисел Фибоначчи: экспоненциальный рекурсивный алгоритм, полиномиальный алгоритм, более детальный анализ. Время работы алгоритма, O-символика. Скорость роста функций: логарифм, полином, экспонента.


Посмотреть видео на сайте Лекториума

Лекция 2. Рекуррентные соотношения.
Метод «разделяй и властвуй». Умножение n-битовых чисел: простой рекурсивный алгоритм, улучшенный рекурсивный алгоритм. Рекуррентные соотношения: основная теорема. Двоичный поиск.


Посмотреть видео на сайте Лекториума

Лекция 3. Алгоритмы сортировки.
Сортировка слиянием: с рекурсией и без. Сортировка с помощью кучи. Нижняя оценка (n log n) для сортировки. Быстрая сортировка: анализ среднего времени работы, анализ глубины рекурсии, элиминация хвостовой рекурсии.


Посмотреть видео на сайте Лекториума

Лекция 4. Алгоритмы сортировки (продолжение).
Быстрая сортировка (продолжение). Порядковые статистики: нахождение за линейное в среднем время.


Посмотреть видео на сайте Лекториума

Лекция 5. Элементарные структуры данных.
Абстрактные типы данных, интерфейс и реализация. Массивы переменного размера: аддитивная и мультипликативная схемы реаллокации. Анализ учётных стоимостей операций: функция потенциала, истинные и учётные стоимости. Стек, очередь, дек. Реализация на основе массива переменного размера и на основе связанного списка. Моделирование очереди с помощью двух стеков. Корневое дерево: бинарное дерево, дерево с произвольным ветвлением, представление «левый ребёнок — правый сосед».


Посмотреть видео на сайте Лекториума

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


Посмотреть видео на сайте Лекториума

Лекция 7. Динамическое программирование (продолжение).
Задача о рюкзаке: рюкзак с повторениями и без, ленивые вычисления. Перемножение последовательности матриц: представление порядка перемножения в виде дерева, оценка на количество порядков. Независимые множества в деревьях. О времени и памяти алгоритмов, основанных на методе динамического программирования.


Посмотреть видео на сайте Лекториума

Лекция 8. Двоичные деревья поиска.
Дерево поиска: поиск, вставка, удаление, поиск следующего и предыдущего элемента за время, пропорциональное высоте. АВЛ-дерево (или какое-нибудь другое сбалансированное дерево): верхняя оценка на высоту, малое и большое вращение.

Лекция 9. Декартовы деревья.
Декартовы деревья, операции split и merge, реализация стандартных операций деревьев поиска через split и merge.

Лекция 10. Сплей-деревья.
Верхняя оценка O(log n) на среднюю стоимость операций.

Лекция 11. Декомпозиция графов.
Графы и способы их представления, способы использования графов. Поиск в глубину в неориентированных графах, выделение компонент связности.


Посмотреть видео на сайте Лекториума

Лекция 12. Декомпозиция графов (продолжение).
Поиск в глубину в ориентированных графах: ориентированные ациклические графы, топологическая сортировка вершин, наличие стока и истока в ациклическом графе, выделение компонент сильной связности.


Посмотреть видео на сайте Лекториума

Лекция 13. Пути в графах.
Расстояния в графе. Поиск в ширину: обход, дерево кратчайших путей, сравнение с поиском в глубину. Алгоритм Дейкстры: адаптация поиска в ширину введением дополнительных вершин; установка будильников; алгоритм Дейкстры; альтернативный взгляд на алгоритм: последовательное расширение множества вершин, до которых расстояние уже посчитано; время работы алгоритма при различных реализациях очереди с приоритетами.


Посмотреть видео на сайте Лекториума

Автор: Roman Brovko

Let's have a REST, часть III

В части I рассказано о том, что такое REST и что значит для приложения быть RESTful. На несложном примере проиллюстрирован процесс проектирования RESTful приложения. В части II рассмотрены некоторые детали протокола HTTP в связи с реализацией на его основе RESTful приложений. В частности, рассказано, в чем разница между HTTP-методами POST и PUT, что такое идемпотентность, как обойти ограничения языка HTML и сделать браузерное HTML-приложение RESTful (ну, почти RESTful).

В данной, заключительной части, будут рассмотрены два RESTful приложения, написанные на Python с использованием микрофреймворка Flask. Оба приложения позволяют вести список книг, то есть, просматривать, добавлять, изменять и удалять книги из списка. Эти два приложения:

  • RESTful web-сервис и его клиент,
  • RESTful HTML-приложение, с которым пользователь работает в браузере.

Я не буду рассказывать о том, как установить Flask (соответствующая инструкция есть на сайте), а также об основах работы с Flask (об этом отлично рассказано в разделе Quickstart руководства пользователя).

Перейду сразу к делу и представлю код web-сервиса, возвращающего CSV-представление списка книг:

# -*- coding: utf-8 -*-

from flask import Flask, url_for

app = Flask(__name__)

books = {1 : [u'Лев Толстой', u'Война и мир']}
HEADERS = {'Content-Type' : 'text/csv; charset=utf-8'}

def csvbook(id):
return u"%s;%s;%sn" % (id, books[id][0], books[id][1])

@app.route('/')
@app.route('/books')
def index():
text = ''
for key in books.keys():
text += csvbook(key)
return text, 200, HEADERS


if __name__ == '__main__':
app.run(debug=True)

Поскольку приложение призвано продемонстрировать принципы REST, то все, что сопутствует этой демонстрации, написано как можно проще, чтобы занимать меньше места и быть понятным без объяснений. Так, книги будем хранить не в базе данных, а в словаре books, где ключ — целое число, а значение — список из двух строковых значений: автор книги, название книги.

Функция index() обрабатывает запросы GET для URL /books и /. Формируется CSV-представление списка книг из словаря books, используя функцию csvbook(id) для получения CSV-строки с данными каждой книги. Сформированное представление возвращается клиенту, причем ответ имеет статус 200 (OK) и HTTP-заголовок, задающий тип и кодировку возвращаемых данных.

Запустив наш сервис

C:> python restful-ws-01.py
* Running on http://127.0.0.1:5000/
* Restarting with reloader

и введя в брузере адрес http://localhost:5000/books, получим файл, содержащий

1;Лев Толстой;Война и мир

Не очень удобно тестировать RESTful web-сервис с помощью браузера. В интернет-магазине Chrome есть приложение Advanced Rest Client, которое существенно упрощает ручное тестирование RESTful web-сервиса. Рекомендую попробовать.

Но в этой статье пойду другим путем и напишу клиента для нашего web-сервиса на Python:

# -*- coding: utf-8 -*-

import requests

def print_response(resp):
print " url: %s" % resp.url
print " status: %s %s" % (resp.status_code, resp.reason)
print "headers: %s " % resp.headers
print " data:n%s" % resp.text

print_response(requests.get("http://localhost:5000/books"))

Я использую библиотеку Requests, которая делает отправку HTTP-запросов с различными методами тривиальной задачей. Результат выполнения приведенного кода:

    url: http://localhost:5000/books
status: 200 OK
headers: CaseInsensitiveDict({'date': 'Thu, 13 Mar 2014 04:39:50 GMT', 'content-length': '45', 'content-type': 'text/csv; charset=utf-8', 'server': 'Werkzeug/0.9.4 Python/2.7.3'})
data:
1;Лев Толстой;Война и мир

Прежде чем реализовать следующие методы web-сервиса и написать для них клиентские запросы, приведу полный список ресурсов и методов web-сервиса:

/books        GET       получить список книг
/books POST создать новую книгу
/books/ GET получить данные книги
/books/ PUT изменить данные книги
/books/ DELETE удалить книгу

Вот код, реализующий перечисленные методы web-сервиса, а также обработчик для случая, когда запрошенный ресурс отсутствует:

# -*- coding: utf-8 -*-

from flask import Flask, request, abort, url_for

app = Flask(__name__)

books = {1 : [u'Лев Толстой', u'Война и мир']}
HEADERS = {'Content-Type' : 'text/csv; charset=utf-8'}

def csvbook(id):
return u"%s;%s;%s;%sn" %
(id, books[id][0], books[id][1], url_for('show', id=id, _external = True))

@app.route('/')
@app.route(&# 39;/books')
def index():
text = ''
for key in books.keys():
text += csvbook(key)
return text, 200, HEADERS

@app.route('/books', methods=['POST'])
def create():
new_id = len(books) + 1
books[new_id] = [request.form['author'], request.form['title']]
return csvbook(new_id), 201, HEADERS

@app.route('/books/')
def show(id):
if books.get(id):
return csvbook(id), 200, HEADERS
else:
abort(404)

@app.route('/books/', methods=['PUT'])
def update(id):
if books.get(id):
books[id] = [request.form['author'], request.form['title']]
else:
abort(404)
return csvbook(id), 200, HEADERS

@app.route('/books/', methods=['DELETE'])
def delete(id):
if books.get(id):
del books[id]
return u'OK', 200, HEADERS

@app.errorhandler(404)
def not_found(error):
return u'404: not found', 404, HEADERS


if __name__ == '__main__':
app.run(debug=True)

Ниже код клиента, тестирующий все методы нашего web-сервиса:

# -*- coding: utf-8 -*-

import requests

def print_response(resp):
print " url: %s" % resp.url
print " status: %s %s" % (resp.status_code, resp.reason)
print "headers: %s " % resp.headers
print " data:n%s" % resp.text

def list_books():
print("n### GET http://localhost:5000/booksn")
print_response(requests.get("http://localhost:5000/books"))


list_books

print("n### POST http://localhost:5000/booksn")
payload = {'author' : u'Александр Пушкин', 'title' : u'Пиковая дама'}
resp = requests.post("http://localhost:5000/books", data=payload)
print_response(resp)

list_books

print("n### PUT http://localhost:5000/books/2n")
payload = {'author' : u'Лев Толстой', 'title' : u'Анна Каренина'}
resp = requests.put("http://localhost:5000/books/2", data=payload)
print_response(resp)

list_books

print("n### DELETE http://localhost:5000/books/2n")
print_response(requests.delete("http://localhost:5000/books/2"))

list_books

print("n### GET http://localhost:5000/books/1n")
print_response(requests.get("http://localhost:5000/books/1"))

print("n### GET http://localhost:5000/books/2n")
print_response(requests.get("http://localhost:5000/books/2"))

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

Теперь перейдем к браузерному RESTful приложению. Оно поддерживает следующие ресурсы и операции:


/books GET получить представление списка книг
/books/new GET получить форму для ввода данных новой книги
/books POST создать новую книгу
/books/ GET получить представление книги
/books//edit GET получить форму для изменения данных книги
/books/ POST изменить данные книги
_method='PUT'
/books//delete POST удалить книгу
_method='DELETE'

Здесь адреса ресурсов следуют соглашениям фреймворка Ruby on Rails — законодателя мод в области RESTful web-приложений. Так как язык HTML не поддерживает запросы к серверу с методами PUT и DELETE, то эти методы имитируются при помощи скрытых полей форм с именем _method.

Ниже приведен код браузерного приложения:

# -*- coding: utf-8 -*-

from flask import Flask, request, redirect, abort

# GET and HEAD are safe
# GET, HEAD, PUT and DELETE are idempotent
# (RFC 2616 http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9)


app = Flask(__name__)
books = {1 : [u'Лев Толстой', u'Война и мир']}

list_books_template = u"""



Список книг



Список книг




%s
idАвторНазвание







"""

show_book_template = u"""



Книга



Книга






id%s
Автор%s
Название%s


К списку книг


"""

edit_book_template = u"""



Книга - Изменить



Книга - Изменить








id%s
Автор
Название








К списку книг


"""

new_book_template = u"""



Книга - Добавить



Книга - Добавить






Автор
Название




К списку книг


"""

error404_template = u"""



Список книг


Такой страницы нет :(




"""

@app.route('/')
@app.route('/books')
def index():
text = ''
for key, val in books.items():
text += u'Edit%s%s%s' % (key, key, key, val[0], val[1])
return list_books_template % text

@app.route('/books/new')
def new():
return new_book_template

@app.route('/books', methods=['POST'])
def create():
new_id = len(books) + 1
books[new_id] = [request.form['author'], request.form['title']]
return show_book_template % (new_id, books[new_id][0], books[new_id][1])


@app.route('/books//edit')
def edit(id):
if books.get(id):
return edit_book_template % (id, id, books[id][0], books[id][1], id)
else:
abort(404)

@app.route('/books/', methods=['GET', 'POST']) # PUT and DELETE
def show(id):
if request.method == 'GET':

# /books/ GET

if books.get(id):
return show_book_template % (id, books[id][0], books[id][1])
else:
abort(404)
elif request.method == 'POST' and request.form['_method'] == 'PUT':

# /books/ PUT

if books.get(id):
books[id] = [request.form['author'], request.form['title']]
else:
abort(404)
return show_book_template % (id, books[id][0], books[id][1])
elif request.method == 'POST' and request.form['_method'] == 'DELETE':

# /books/ DELETE

if books.get(id):
del books[id]
return redirect('/books')


@app.errorhandler(404)
def not_found(error):
return error404_template, 404


if __name__ == '__main__':
app.run(debug=True)

Запустив приложение

C:> python restful-server.py
* Running on http://127.0.0.1:5000/
* Restarting with reloader

и введя в браузере адрес http://localhost:5000/books, попробуйте просматривать, изменять, добавлять и удалять книги.

В отличие от web-сервиса, в браузерном RESTful приложении большую роль играют гиперссылки, содержащиеся в представлениях (HTML-страницах), возвращаемых сервером клиенту (браузеру). Гиперссылки раскрывают перед пользователем структуру приложения, предлагая ему на выбор возможные варианты действий.

Пока всё. Let's have a rest!

Автор: Andrei Trofimov
Дата публикации: 2014-03-19T21:05:00.000+11:00

Видеолекции курса Распределенные системы хранения и обработки данных

Видеолекции курса Распределенные системы хранения и обработки данных.

Лектор: Владислав Белогрудов.

В курсе дано всестороннее представление о системах и сетях хранения данных, их применимости для построения облачной инфраструктуры. Подробно рассматриваются вопросы дизайна и виртуализации сетей хранения данных, информационной безопасности и доступности.


Лекция 1. Введение в системы хранения данных (СХД).

  • данные и информация
  • типы данных
  • большие данные
  • эволюция СХД
  • архитектура центра обработки данных (ЦОД)
  • характеристики ЦОД
  • жизненный цикл информации
  • иерархическое управление носителями


Посмотреть видео на сайте Лекториума

Дополнительные материалы


Скачать: Презентация

Лекция 2. Среда систем хранения данных.

  • Oсновные элементы
  • Виртуализация приложений и серверов
  • Компоненты жесткого диска и его производительность
  • Накопители SSD


Посмотреть видео на сайте Лекториума

Дополнительные материалы


Скачать: Презентация

Лекция 3. Защита данных с помощью RAID.

  • Методы и техники
  • Типы
  • Производительность
  • Cравнение и области применения


Посмотреть видео на сайте Лекториума

Дополнительные материалы


Скачать: Презентация

Лекция 4. Архитектура СХД.

  • основные компоненты
  • управление кешированием, защита от сбоев
  • классы СХД


Посмотреть видео на сайте Лекториума

Дополнительные материалы


Скачать: Презентация

Лекция 5. Сети хранения FC SAN.

  1. DAS
  2. SCSI
  3. SAN
    • компоненты
    • архитектура
    • топологии
    • зонирование


Посмотреть видео на сайте Лекториума

Дополнительные материалы


Скачать: Презентация

Лекция 6. IP SAN, FCoE, NAS, CAS.

  • протоколы
  • компоненты
  • топологии


Посмотреть видео на сайте Лекториума

Дополнительные материалы


Скачать: Презентация

Лекция 7. OpenStack.

  • Собственное облако
    • Зачем
    • Отличия от решений виртуализации серверов
  • История развития
  • Проекты
    • Swift
    • Glance
    • Nova
    • Cinder
    • Quantum

  • Посмотреть видео на сайте Лекториума

    Дополнительные материалы


    Скачать: Презентация

    Лекция 8. Непрерывность бизнеса, резервное копирование и восстановление.

    • необходимость
    • метрики непрерывности
    • методы борьбы с SPOF
    • топологии резервного копирования
    • дедупликация
    • резервное копирование в виртуальной среде


    Посмотреть видео на сайте Лекториума

    Дополнительные материалы


    Скачать: Презентация

    Лекция 9. Локальная и удаленная репликация.

    • синхронный и асинхронный режим
    • методы
    • топологии


    Посмотреть видео на сайте Лекториума

    Дополнительные материалы


    Скачать: Презентация

    Лекция 10. Безопасность инфраструктуры хранения в облачных датацентров.

    • угрозы
    • уязвимости
    • методы борьбы


    Посмотреть видео на сайте Лекториума

    Дополнительные материалы

    Скачать: Презентация

    Лекция 11. Программно определяемые сети (SDN).

    • Предпосылки
    • История
    • Принципы
    • Технологии
    • Области применения

    Дополнительные материалы

    Скачать: Презентация

    Лекция 12. Управление инфраструктурой хранения и обработки данных.

    • Ключевые понятия
    • Стандарты управления
    • Технологии
    • Архитектуры

    Дополнительные материалы

    Скачать: Презентация

    Автор: Roman Brovko