SlideShare a Scribd company logo
1 of 76
Download to read offline
View как чистая функция
от состояния базы
данных
Илья Беда / bro.agency
Кто я?
● Тимлид и один из основателей bro.agency
● Разрабатываю веб-формочки на python в течении 7
лет
● Специализируюсь на аутсорс-разработке
● Продвигаю функциональное программирование в
массы
● Провожу воркшопы и мастер-классы
● С недавнего времени выступаю на конференциях
2
There are only two hard things in Computer
Science: cache invalidation and naming things.
Phil Karlton
3
Какая нам нужна инвалидация кэша?
4
Инвалидация по умолчанию (по таймауту)
5
Инвалидация по умолчанию (по таймауту)
6
Слишком часто Слишком редко
Инвалидация по умолчанию (по таймауту)
7
Слишком часто Слишком редко
Кэш становится не
актуальным, но сами
данные остались
неизменными
Пользователь увидит не
актуальную версию
страницы
Инвалидация по умолчанию (по таймауту)
8
Слишком часто Слишком редко
Кэш становится не
актуальным, но сами
данные остались
неизменными
Пользователь увидит не
актуальную версию
страницы
9
Какую инвалидацию использовать для таких
приложений?
10
Как работает ВЕБ
11
Что делает Handler?
12
Получение
данных из базы
Формирование
контекста
Рендер
шаблона
Что делает Handler?
13
Запросы к
внешнему API
Формирование
контекста
json.dumps
И handler очень похож на чистую функцию от
состояния базы данных
14
Получение
данных из базы
Формирование
контекста
Рендер
шаблона
Какие функции являются чистыми?
15
Какие функции являются чистыми?
1. Детерминированные функции
2. Функции не обладающие сторонними эффектами
16
Чистая функция
17
Не чистая функция
18
В чем преимущества чистых функций?
19
В чем преимущества чистых функций?
Для одного и того же набора аргументов она
возвращает одно и тоже значение.
Что упрощает проблему инвалидации
20
Давайте сделаем наш ВЕБ функционально
чистым и забудем про проблемы
инвалидации кэша.
21
Как это выглядит в реальности (Django)
22
1
2
3
4
5
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
Как это выглядит в реальности (Django)
23
1
2
3
4
5
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
Как это выглядит в реальности (Django)
24
1
2
3
4
5
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
Как это выглядит в реальности (Django)
25
1
2
3
4
5
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
Проанализируем с точки зрения чистоты
26
1
2
3
4
5
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
Проанализируем с точки зрения чистоты
27
1
2
3
4
5
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
Получается наш ВЕБ
НЕ
функционально чистый.
28
Приведем функцию к чистому виду
29
1
2
3
4
5
6
7
8
9
10
def some_view(request, url_param):
items = list(
SomeModel.objects.filter(some_field=url_param))
@cache_pure
def _some_view_pure(object_list):
c = Context({'items': object_list})
response = Template("my_template.html").render(c)
return HttpResponse(response)
return _some_view_pure(items)
Приведем функцию к чистому виду
30
1
2
3
4
5
6
7
8
9
10
def some_view(request, url_param):
items = list(
SomeModel.objects.filter(some_field=url_param))
@cache_pure
def _some_view_pure(object_list):
c = Context({'items': object_list})
response = Template("my_template.html").render(c)
return HttpResponse(response)
return _some_view_pure(items)
Приведем функцию к чистому виду
31
1
2
3
4
5
6
7
8
9
10
def some_view(request, url_param):
items = list(
SomeModel.objects.filter(some_field=url_param))
@cache_pure
def _some_view_pure(object_list):
c = Context({'items': object_list})
response = Template("my_template.html").render(c)
return HttpResponse(response)
return _some_view_pure(items)
Давайте пофантазируем
32
1
2
3
4
5
6
7
8
9
10
11
def some_view(request, url_param):
@cache_pure
def _some_view_pure(url_param, database_state):
items = SomeModel.objects.filter(
some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
return _some_view_pure(
url_param,
get_database_state_from_magic())
Давайте пофантазируем
33
1
2
3
4
5
6
7
8
9
10
11
def some_view(request, url_param):
@cache_pure
def _some_view_pure(url_param, database_state):
items = SomeModel.objects.filter(
some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
return _some_view_pure(
url_param,
get_database_state_from_magic())
Давайте пофантазируем
34
1
2
3
4
5
6
7
8
9
10
11
def some_view(request, url_param):
@cache_pure
def _some_view_pure(url_param, database_state):
items = SomeModel.objects.filter(
some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
return _some_view_pure(
url_param,
get_database_state_from_magic())
def get_database_state_from_magic():
Что же это такое состояние базы данных?
35
def get_database_state_from_magic():
return subprocess.check_output(["pg_dump"])
36
def get_database_state_from_magic():
Если пренебречь тем, что база данных может
вернуться в предыдущее состояние, то можно
использовать индекс поколений.
И это практичное решение проблемы, которое можно
использовать.
37
38
News News News
DB State 1 DB State 2 DB State 3
Реализация индексирования поколений
39
1
2
3
4
5
6
7
8
9
10
11
import redis
from django.db.models.signals import post_save
r = redis.StrictRedis(host='localhost', port=6379, db=0)
def inc_generation_index(sender, **kwargs):
r.incr('generation_index')
post_save.connect(inc_generation_index)
def get_database_state_from_magic():
return r.get('generation_index')
Реализация индексирования поколений
40
1
2
3
4
5
6
7
8
9
10
11
import redis
from django.db.models.signals import post_save
r = redis.StrictRedis(host='localhost', port=6379, db=0)
def inc_generation_index(sender, **kwargs):
r.incr('generation_index')
post_save.connect(inc_generation_index)
def get_database_state_from_magic():
return r.get('generation_index')
Реализация индексирования поколений
41
1
2
3
4
5
6
7
8
9
10
11
import redis
from django.db.models.signals import post_save
r = redis.StrictRedis(host='localhost', port=6379, db=0)
def inc_generation_index(sender, **kwargs):
r.incr('generation_index')
post_save.connect(inc_generation_index)
def get_database_state_from_magic():
return r.get('generation_index')
Реализация индексирования поколений
42
1
2
3
4
5
6
7
8
9
10
11
import redis
from django.db.models.signals import post_save
r = redis.StrictRedis(host='localhost', port=6379, db=0)
def inc_generation_index(sender, **kwargs):
r.incr('generation_index')
post_save.connect(inc_generation_index)
def get_database_state_from_magic():
return r.get('generation_index')
Реализация индексирования поколений
43
1
2
3
4
5
6
7
8
9
10
11
import redis
from django.db.models.signals import post_save
r = redis.StrictRedis(host='localhost', port=6379, db=0)
def inc_generation_index(sender, **kwargs):
r.incr('generation_index')
post_save.connect(inc_generation_index)
def get_database_state_from_magic():
return r.get('generation_index')
И теперь это реально работающий код
44
1
2
3
4
5
6
7
8
9
10
11
def some_view(request, url_param):
@cache_pure
def _some_view_pure(url_param, database_state):
items = SomeModel.objects.filter(
some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
return _some_view_pure(
url_param,
get_database_state_from_magic())
Какие могут быть проблемы
при индексировании поколений?
45
Слишком частая инвалидация.
Кэш становится неактуальным, но сами
данные остались неизменными
46
47
current_news
News.objects.filter(hidden=False)
news_comemnts
Comment.objects.filter(news_id=1, hidden=False)
News Comment
48
current_news
News.objects.filter(hidden=False)
news_comemnts
Comment.objects.filter(news_id=1, hidden=False)
News Comment
+ Comment
49
current_news
News.objects.filter(hidden=False)
news_comemnts
Comment.objects.filter(news_id=1, hidden=False)
News Comment
Comment
50
current_news
News.objects.filter(hidden=False)
news_comemnts
Comment.objects.filter(news_id=1, hidden=False)
News Comment
Comment
51
current_news
News.objects.filter(hidden=False)
news_comemnts
Comment.objects.filter(news_id=1, hidden=False)
News Comment
Comment
hidden = True
Гранулярная инвалидация сделает
кэширование оптимальнее.
52
Можно индексировать поколения каждой
таблицы отдельно.
https://github.com/jmoiron/johnny-cache
53
54
current_news
News.objects.filter(hidden=False)
news_comemnts
Comment.objects.filter(news_id=1, hidden=False)
News Comment
Comment
55
В реальности очень много таблиц, поэтому это будет
прекрасно работать.
News Comment Page Event User
Можно пойти дальше и инвалидировать кэш,
зависящий от определенной части состояния базы
данных.
Тогда нам нужен инструмент для описания этой
части.
56
57
current_news
News.objects.filter(hidden=False)
news_comemnts
Comment.objects.filter(news_id=1, hidden=False)
News Comment
58
current_news
News.objects.filter(hidden=False)
news_comemnts
Comment.objects.filter(news_id=1, hidden=False)
News Comment
Можно индексировать части запросов
59
News.hiden=False
Comment.news_id=1
Comment.hidden=False
Cache Store Criterion
Можно индексировать части запросов
60
News.hiden=False
Comment.news_id=1
Comment.hidden=False
Cache Store Criterion
+ Comment
hiden True
news_id 1
Можно индексировать части запросов
61
News.hiden=False
Comment.news_id=1
Comment.hidden=False
Cache Store Criterion
+ Comment
hiden True
news_id 1
Можно индексировать части запросов
62
News.hiden=False
Comment.news_id=1
Comment.hidden=False
Cache Store Criterion
+ Comment
hiden True
news_id 1
Можно индексировать части запросов
63
News.hiden=False
Comment.hidden=False
Cache Store Criterion
Тоже есть готова реализация
http://hackflow.com/blog/2014/03/09/on-orm-
cache-invalidation/
https://github.com/suor/django-cacheops
64
Эффективное кэширование с помощью
cacheops
65
1
2
3
4
5
6
7
8
9
10
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
@cached_view_as(items)
def _render(request, url_param):
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
return _render(request, url_param)
Эффективное кэширование с помощью
cacheops
66
1
2
3
4
5
6
7
8
9
10
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
@cached_view_as(items)
def _render(request, url_param):
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
return _render(request, url_param)
Эффективное кэширование с помощью
cacheops
67
1
2
3
4
5
6
7
8
9
10
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
@cached_view_as(items)
def _render(request, url_param):
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
return _render(request, url_param)
Как же быть с Class Based View?
68
Class Based View
69
1
2
3
4
5
6
7
8
class SomeModelListView(ListView)
def get_queryset(self):
return SomeModel.objects.all()
def get(self, request, *args, **kwargs):
self.object_list = self.get_queryset()
context = self.get_context_data()
return self.render_to_response(context)
Class Based View
70
1
2
3
4
5
6
7
8
class SomeModelListView(ListView)
def get_queryset(self):
return SomeModel.objects.all()
def get(self, request, *args, **kwargs):
self.object_list = self.get_queryset()
context = self.get_context_data()
return self.render_to_response(context)
Class Based View
71
1
2
3
4
5
6
7
class CachedListView(ListView):
def get(self, request, *args, **kwargs):
@cached_view_as(self.get_queryset())
def _get(request, *args, **kwargs):
return = super(CachedListView, self).get(
request, *args, **kwargs)
return _get(request, *args, **kwargs)
Class Based View
72
1
2
3
4
5
6
7
class CachedListView(ListView):
def get(self, request, *args, **kwargs):
@cached_view_as(self.get_queryset())
def _get(request, *args, **kwargs):
return = super(CachedListView, self).get(
request, *args, **kwargs)
return _get(request, *args, **kwargs)
Class Based View
73
1
2
3
4
5
6
7
class CachedListView(ListView):
def get(self, request, *args, **kwargs):
@cached_view_as(self.get_queryset())
def _get(request, *args, **kwargs):
return = super(CachedListView, self).get(
request, *args, **kwargs)
return _get(request, *args, **kwargs)
Class Based View
74
1
2
class NewsView(CachedListView):
model = News
Кэшируйте правильно!
Инвалидируйте правильно!
75
Кэшируйте правильно!
Инвалидируйте правильно!
ir4y.ix@gmail.com
76

More Related Content

What's hot

XPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverXPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverИлья Кожухов
 
"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндекс"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндексit-people
 
Автоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows PhoneАвтоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows PhoneCodeFest
 
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис РечкуновDevDay
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5Technopark
 
React со скоростью света: не совсем обычный серверный рендеринг
React со скоростью света: не совсем обычный серверный рендерингReact со скоростью света: не совсем обычный серверный рендеринг
React со скоростью света: не совсем обычный серверный рендерингTimophy Chaptykov
 
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис РечкуновJSib
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полнойОмские ИТ-субботники
 
10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)Roman Brovko
 
Selenium: приемы работы
Selenium: приемы работыSelenium: приемы работы
Selenium: приемы работыPaul Stashevsky
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf Conference
 
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Timur Shemsedinov
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
Коротко о React.js
Коротко о React.jsКоротко о React.js
Коротко о React.jsMad Devs
 
Михаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: АсинхронностьМихаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: АсинхронностьYandex
 
FPUG Dzyga presentation
FPUG Dzyga presentationFPUG Dzyga presentation
FPUG Dzyga presentationIvan Filimonov
 

What's hot (20)

XPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverXPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriver
 
"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндекс"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндекс
 
Автоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows PhoneАвтоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows Phone
 
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5
 
React со скоростью света: не совсем обычный серверный рендеринг
React со скоростью света: не совсем обычный серверный рендерингReact со скоростью света: не совсем обычный серверный рендеринг
React со скоростью света: не совсем обычный серверный рендеринг
 
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)
 
Component Inspector
Component InspectorComponent Inspector
Component Inspector
 
Selenium: приемы работы
Selenium: приемы работыSelenium: приемы работы
Selenium: приемы работы
 
Selenium vs AJAX
Selenium vs AJAXSelenium vs AJAX
Selenium vs AJAX
 
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
 
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
 
Performance optimisation in javascript
Performance optimisation in javascriptPerformance optimisation in javascript
Performance optimisation in javascript
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Коротко о React.js
Коротко о React.jsКоротко о React.js
Коротко о React.js
 
Михаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: АсинхронностьМихаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: Асинхронность
 
FPUG Dzyga presentation
FPUG Dzyga presentationFPUG Dzyga presentation
FPUG Dzyga presentation
 

Similar to View как чистая функция от состояния базы данных - Илья Беда, bro.agency

Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноKrivoy Rog IT Community
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Minktyomo4ka
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в DjangoMoscowDjango
 
PHP Tricks
PHP TricksPHP Tricks
PHP TricksBlackFan
 
django cheBit'11
django cheBit'11django cheBit'11
django cheBit'11dva
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4Technopark
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)Ontico
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4Technopark
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Yandex
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentAnton Kirillov
 
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...Andrey Karpov
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один goBadoo Development
 
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Ontico
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Oleksii Okhrymenko
 

Similar to View как чистая функция от состояния базы данных - Илья Беда, bro.agency (20)

Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 
django cheBit'11
django cheBit'11django cheBit'11
django cheBit'11
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application Development
 
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
 
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
 

More from it-people

«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Coit-people
 
«Scrapy internals» Александр Сибиряков, Scrapinghub
«Scrapy internals» Александр Сибиряков, Scrapinghub«Scrapy internals» Александр Сибиряков, Scrapinghub
«Scrapy internals» Александр Сибиряков, Scrapinghubit-people
 
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrainsit-people
 
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologiesit-people
 
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«Ещё один Поиск Яндекса» Александр Кошелев, Яндексit-people
 
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...it-people
 
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalrit-people
 
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...it-people
 
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАН«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАНit-people
 
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банкit-people
 
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Coit-people
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНСit-people
 
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...it-people
 
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologiesit-people
 
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn Systemit-people
 
«(Без)опасный Python», Иван Цыганов, Positive Technologies
«(Без)опасный Python», Иван Цыганов, Positive Technologies«(Без)опасный Python», Иван Цыганов, Positive Technologies
«(Без)опасный Python», Иван Цыганов, Positive Technologiesit-people
 
«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндекс«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндексit-people
 
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...it-people
 
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognicianit-people
 
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...it-people
 

More from it-people (20)

«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
 
«Scrapy internals» Александр Сибиряков, Scrapinghub
«Scrapy internals» Александр Сибиряков, Scrapinghub«Scrapy internals» Александр Сибиряков, Scrapinghub
«Scrapy internals» Александр Сибиряков, Scrapinghub
 
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
 
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
 
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
 
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
 
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
 
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
 
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАН«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
 
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
 
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
 
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
 
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
 
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
 
«(Без)опасный Python», Иван Цыганов, Positive Technologies
«(Без)опасный Python», Иван Цыганов, Positive Technologies«(Без)опасный Python», Иван Цыганов, Positive Technologies
«(Без)опасный Python», Иван Цыганов, Positive Technologies
 
«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндекс«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндекс
 
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
 
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
 
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
 

View как чистая функция от состояния базы данных - Илья Беда, bro.agency