SlideShare uma empresa Scribd logo
1 de 100
Baixar para ler offline
Ring
OOP
user item .

user_add_item(user, item) 

.

user_delete_item user_clear_items .

user.add_item(item) .
user item 

.

user.get_items() 

user.get_cached_items(storage) .

item . .

user.invalidate_items() user.delete_cached_items(storage)

.

Ring user.get_items.delete() .
• Ring .

• .

.
?
?
Ring
? ?
=
?
• 

• 

• 

• :




• IO ...
• IO ...
• IO ...
decorator
decorator
decorator
decorator
decorator


pure function
• 

“ 

. (... ...) .” 

( ) -
• 

“ 

. (... ...) .” 

( ) -
# 60 * 15
# cache_page: Django HTTP decorator
# 60 * 15
PyCon Django , ?
# cache_page: Django HTTP decorator
# 60 * 15
PyCon Django , ?
..?
# cache_page: Django HTTP decorator
Ring
Ring
• Sub-function control
• Methods & descriptor support

• Key Consistency

• Backend: memcache, redis, diskcache, shelve, dict

• asyncio support

• Fully customizable

• Django integration
Sub-functions
•
import ring
@ring.dict({})
def function(v):
return ...
import functools
@functools.lru_cache()
def function(v)
return ...
Ring lru_cache
Sub-functions
•
from django… 
import cache_page
@cache_page(60)
def view(request):
return ...
import ring
@ring.dict(
{}, expire=60)
def function(v):
return ...
Ring Django per-view cache
Sub-functions
• 

• &
value = function(10) value = function(10)
import ring
@ring.dict({})
def function(v):
return ...
import functools
@functools.lru_cache()
def function(v)
return ...
Ring lru_cache
Sub-functions
• • python-memcached
function.delete(10)
key = create_key(10)
client.delete(key)
Sub-functions
• • python-memcached
key = create_key(10)
value = function(10)
client.set(key)
value = 
function.update(10)
Sub-functions
• & • python-memcached
value = function(10)



value = function
.get_or_update(10)
key = create_key(10)
value = client.get(key)
if value is None:
value = function(10)
client.set(key)
Sub-functions
• & 

• 

• 

• 

• 

• ...
value = function(10)
function.delete(10)
value = function.update(10)
value = function.execute(10)
value = function.get(10)
Sub-functions
• Django
Sub-functions
• Django
Sub-functions
• get_many

• set_many, update_many, get_or_update_many …
@ring.memcache(...)
def f(a, b):
...
# getting data for f(1, 2), f(1, 3), f(a=2, b=2)
data = f.get_many((1, 2), (1, 3), {'a': 2, 'b': 2})
# data sequence(list)
Sub-functions
• get_many

• set_many, update_many, get_or_update_many …
@ring.memcache(...)
def f(a, b):
return a * 100 + b
# getting data for f(1, 2), f(1, 3), f(a=2, b=2)
data = f.get_many((1, 2), (1, 3), {'a': 2, 'b': 2})
assert data == [102, 103, 202]
Sub-functions
• get_many

• execute_many, set_many, update_many, get_or_update_many …,
@ring.memcache(...)
def f(a, b):
return a * 100 + b
# getting data for f(1, 2), f(1, 3), f(a=2, b=2)
data = f.get_many((1, 2), (1, 3), {'a': 2, 'b': 2})
assert data == [102, 103, 202]
Sub-functions
• ( ) 

• 

• ( ) namespace
Ring
• Sub-function control

• Methods & descriptor support
• Key Consistency

• Backend: memcache, redis, diskcache, shelve, dict

• asyncio support

• Fully customizable

• Django integration
Methods & Descriptors
class UserAPI(object):
url_prefix = 'https://...'
secret_key = '...'
def __init__(self, user_id):
self.user_id = user_id
# cache?
@classmethod
def api_status(cls):
return request(
f'{cls.url_prefix}/status')
# cache?
def get_user(self, n):
return request(
f'{cls.url_prefix}/users/{n}')
Methods & Descriptors
• ?

• ( )

• 

• In-house 

class UserAPI(object):
url_prefix = 'https://...'
secret_key = '...'
def __init__(self, user_id):
self.user_id = user_id
# cache?
@classmethod
def api_status(cls):
return request(
f'{cls.url_prefix}/status')
# cache?
def get_user(self, n):
return request(
f'{cls.url_prefix}/users/{n}')
Methods & Descriptors
• Ring:
class UserAPI(object):
url_prefix = 'https://...'
secret_key = '...'
def __init__(self, user_id):
self.user_id = user_id
@ring.dict({}, expire=5)
@classmethod
def api_status(cls):
return request(
f'{cls.url_prefix}/status')
@ring.dict({}, expire=60)
def get_user(self, n):
return request(
f'{cls.url_prefix}/users/{n}')
Methods & Descriptors
• Ring: 

• (free) function

• method

• classmethod

• staticmethod

• property

• custom descriptors

• hybridmethod?
hybridproperty?

• descriptor
class UserAPI(object):
url_prefix = 'https://...'
secret_key = '...'
def __init__(self, user_id):
self.user_id = user_id
@ring.dict({}, expire=5)
@classmethod
def api_status(cls):
return request(
f'{cls.url_prefix}/status')
@ring.dict({}, expire=60)
def get_user(self, n):
return request(
f'{cls.url_prefix}/users/{n}')
Methods & Descriptors
• Q: Ring method/descriptor ?
Methods & Descriptors
• Q: Ring method/descriptor ?

• A: https://github.com/youknowone/wirerope
Ring
• Sub-function control

• Methods & descriptor support

• Key Consistency
• Backend: memcache, redis, diskcache, shelve, dict

• sync/asyncio support

• Fully customizable

• Django integration
Key consistency
• 

• (expire, invalidate)
Key consistency
• 

• (expire, invalidate)
function(1)
function(v=1)
?
@functools.lru_cache(

maxsize=64)
def function(v):
return ...
Key consistency
• 

• (expire, invalidate)
function(1)
function(v=1)@functools.lru_cache(

maxsize=64)
def function(v):
return ...
?
...
Key consistency
• 

• (expire, invalidate)
function.delete(1)
function(v=1)@ring.dict({})
def function(v):
return ...
?
Key consistency
• 

• (expire, invalidate)
function.delete(1)
function(v=1)@ring.dict({})
def function(v):
return ...
?
Key consistency
• 

• (expire, invalidate)
>>> import sample
sample.f:1:2
sample.f:1:2
sample.f:1:2
import ring
@ring.dict({})
def f(a, *, b):
return ...
print(f.key(1, b=2))
print(f.key(a=1, b=2))
print(f.key(**{'a': 1, 'b': 2}))
Key consistency
• 

• (expire, invalidate)
>>> import sample
sample.A.f:A():1
sample.A.g:A:2
sample.A.g:A:3
import ring
class A(object):
def __ring_key__(self):
return 'A()'
@ring.dict({})
def f(self, a):
pass
@ring.dict({})
@classmethod
def g(cls, a):
pass
a = A()
print(a.f.key(a=1))
print(a.g.key(a=2))
print(A.g.key(a=3))
Key policy
• 1 ( ) 

• ( )

• ( )
Ring
• Sub-function control

• Methods & descriptor support

• Key Consistency

• Backend: memcache, redis, diskcache, shelve, dict
• asyncio support

• Fully customizable

• Django integration
Backends
@ring.dict(s)

@ring.shelve(s)

@ring.memcache(s)

@ring.redis(s)

@ring.diskcache(s)

@ring.django.cache()
Backends
@ring.dict(s)

@ring.shelve(s)

@ring.memcache(s)

@ring.redis(s)

@ring.diskcache(s)

@ring.django.cache()
dict

shelve.Shelf

memcache.Client (python-memcached)

pylibmc.Client

pymemcache.client.Client

aiomcache.Client

redis.Client

aioredis.Client

diskcache.Cache

django.core.cache.caches
Ring
• Sub-function control

• Methods & descriptor support

• Key Consistency

• Backend: memcache, redis, diskcache, shelve, dict

• asyncio support
• Fully customizable

• Django integration
Backends
@ring.dict(s)

@ring.shelve(s)

@ring.memcache(s)

@ring.redis(s)

@ring.diskcache(s)
dict
shelve.Shelf
memcache.Client (python-memcached)

pylibmc.Client

pymemcache.client.Client

aiomcache.Client
redis.Client

aioredis.Client
diskcache.Cache
Backends
• Q: ?

• A: 30
Backends
• Q: ?

• A: 30
class MemcacheStorage(
fbase.CommonMixinStorage, fbase.StorageMixin, BulkStorageMixin):
def get_value(self, key):
value = self.backend.get(key)
if value is None:
raise fbase.NotFound
return value
def set_value(self, key, value, expire):
self.backend.set(key, value, expire)
def delete_value(self, key):
self.backend.delete(key)
def touch_value(self, key, expire):
self.backend.touch(key, expire)
def get_many_values(self, keys):
values = self.backend.get_multi(keys)
return [values.get(k, fbase.NotFound) for k in keys]
def set_many_values(self, keys, values, expire):
self.backend.set_multi({k: v for k, v in zip(keys, values)}, expire)
def delete_many_values(self, keys):
return self.backend.delete_multi(keys)
Ring
• Sub-function control

• Methods & descriptor support

• Key Consistency

• Backend: memcache, redis, diskcache, shelve, dict

• asyncio support

• Fully customizable
• Django integration
Storage Key
• Q: Ring
Storage Key
sample.article:42

@ring.memcache(client)
def article(id):
return ...
print(article.key(42))
Storage Key
sample.article:42

new_prefix:42
@ring.memcache(client)
def article(id):
return ...
print(article.key(42))
@ring.memcache(client,
key_prefix='new_prefix')
def article(id):
return ...
print(article.key(42))
case1: prefix config
Storage Key
sample.article:42

a42e
@ring.memcache(client)
def article(id):
return ...
print(article.key(42))
@article.ring.key
def article_key(id):
return f'a{id}e'
print(article.key(42))
case2: key function override
Data Encoder
• Q: , ?

•
Data Encoder
dict(id=42, name='Name')

dict(id=42, name='Name')
@ring.dict({})
def user1(id):
return {
'id': id,
'name': 'Name'}
print(user1(42))
@ring.dict(
{}, coder='json')
def user2(id):
return {
'id': id,
'name': 'Name'}
print(user2(42))
Data Encoder
dict(id=42, name='Name')

# = json.dumps(user1(42))

b'{"id": id, "name": "Name"}'
d1 = {}
@ring.dict(d1)
def user1(id):
return {
'id': id,
'name': 'Name'}
print(d1[42])
d2 = {}
@ring.dict(d2, coder='json')
def user2(id):
return {
'id': id,
'name': 'Name'}
print(d2[42])
Data Encoder
• Q: 

•
Data Encoder
• json, pickle 

•
Data Encoder
# = json.dumps(user1(42))

'{"id": id, "name": "Name"}'
d1 = {}
@ring.dict(d1)
def user1(id):
return {
'id': id,
'name': 'Name'}
@user1.ring.encode
def user_encode(v):
return json.dumps(v)
@user1.ring.decode
def user_decode(v):
return json.loads(v)
print(d1[42])
case1: single function coder
Data Encoder
import json
import ring
ring.coder.register(
'json', (json.dumps, json.loads))
import pickle
import ring
ring.coder.register(
'pickle', (pickle.dumps, pickle.loads))
case2: reusable coder
Strategy
• __call__, get, update, delete ?

• ?

• ex: 

• ?

• ex: expire hit 

•
Strategy
• __call__, get, update, delete ?

• ?

• ex: 

• ?

• ex: expire hit 

• UserInterface
Low-level Interface
• Q: UserInterface ?
Ring ?
Ring ?
Low-level Interface
@ring.memcache(client, key_prefix='article')
def article(id):
return ...
Low-level Interface
@ring.memcache(client, key_prefix='article')
def article(id):
return ...
key = article.key(42) # key
encoded = client.get(key) # memcache get
data = article.decode(encoded) #
Low-level Interface
@ring.memcache(client, key_prefix='article')
def article(id):
return ...
key = article.key(42) # key
encoded = client.get(key) # memcache get
data = article.decode(encoded) #
data = article.get(42) # 3
Low-level Interface
• : 

•
Ring
inspect.signature
• parameters & return annotation

• Python 3.3+

• Backport: https://pypi.org/project/inspect2/
inspect.signature
In [1]: def f(a, b, *args, x, y=10, **kw):
...: pass
...:
In [2]: import inspect
In [3]: s = inspect.signature(f)
Out[4]: <Signature (a, b, *args, x, y=10, **kw)>
In [6]: for name, parameter in s.parameters.items():
...: print(name, parameter.kind, parameter.default)
...:
a POSITIONAL_OR_KEYWORD <class 'inspect._empty'>
b POSITIONAL_OR_KEYWORD <class 'inspect._empty'>
args VAR_POSITIONAL <class 'inspect._empty'>
x KEYWORD_ONLY <class 'inspect._empty'>
y KEYWORD_ONLY 10
kw VAR_KEYWORD <class 'inspect._empty'>
qualname
• / 



• 

(py2 im_class !)

• Python 3.3+
>>> class C:
... def f(): pass
... class D:
... def g(): pass
...
>>> C.__qualname__
'C'
>>> C.f.__qualname__
'C.f'
>>> C.D.__qualname__
'C.D'
>>> C.D.g.__qualname__
'C.D.g'
annotation
• def f(a: int, b: int) -> int:

return a + b

print(f.__annotations__)

{'a': <class 'int'>, 'b': <class 'int'>, 'return': <class 'int'>}

• inspect.signature(f).return_annotation

int

• inspect.signature(f.get).return_annotation

Optional[int]

• inspect.signature(f.key).return_annotation

str
pickle, shelve
• pickle: serialize 

• shelve: pickle dict DB

•
Methods & Descriptors
• Q: Ring method/descriptor ?

• A: https://github.com/youknowone/wirerope

• Rope: 

(unbound Rope )

• Wire: (method),

(classmethod) 

( bind Wire )

• hybridmethod, hybridproperty
Descriptor analysis
• :

• ?

• descriptor ?

• method property ?

• descriptor ?

(= method classmethod - hybrid )

• descriptor ?

• ?
Descriptor analysis
• :

• ?

• descriptor ?

• method property ?

• descriptor ?

(= method classmethod - hybrid )

• descriptor ?

• ?




2.7, 3.4-3.7 / PyPy2 PyPy3
def _f(owner):
return owner
Django app in single file
• Django ...

• ?

• 30 Django app 

• https://github.com/youknowone/django-app-in-single-file

Mais conteúdo relacionado

Mais procurados

The (unknown) collections module
The (unknown) collections moduleThe (unknown) collections module
The (unknown) collections modulePablo Enfedaque
 
Coding Horrors
Coding HorrorsCoding Horrors
Coding HorrorsMark Baker
 
Desarrollo de módulos en Drupal e integración con dispositivos móviles
Desarrollo de módulos en Drupal e integración con dispositivos móvilesDesarrollo de módulos en Drupal e integración con dispositivos móviles
Desarrollo de módulos en Drupal e integración con dispositivos móvilesLuis Curo Salvatierra
 
Leveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHPLeveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHPJeremy Kendall
 
Php 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the GoodPhp 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the GoodJeremy Kendall
 
Leveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHPLeveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHPJeremy Kendall
 
Saving Gaia with GeoDjango
Saving Gaia with GeoDjangoSaving Gaia with GeoDjango
Saving Gaia with GeoDjangoCalvin Cheng
 
Django101 geodjango
Django101 geodjangoDjango101 geodjango
Django101 geodjangoCalvin Cheng
 
Ansible, voyage au centre de l'automatisation
Ansible, voyage au centre de l'automatisationAnsible, voyage au centre de l'automatisation
Ansible, voyage au centre de l'automatisationMickael Hubert
 
Pry, the good parts
Pry, the good partsPry, the good parts
Pry, the good partsConrad Irwin
 
PHP Loves MongoDB - Dublin MUG (by Hannes)
PHP Loves MongoDB - Dublin MUG (by Hannes)PHP Loves MongoDB - Dublin MUG (by Hannes)
PHP Loves MongoDB - Dublin MUG (by Hannes)Mark Hillick
 
Rapid and Scalable Development with MongoDB, PyMongo, and Ming
Rapid and Scalable Development with MongoDB, PyMongo, and MingRapid and Scalable Development with MongoDB, PyMongo, and Ming
Rapid and Scalable Development with MongoDB, PyMongo, and MingRick Copeland
 
Обзор фреймворка Twisted
Обзор фреймворка TwistedОбзор фреймворка Twisted
Обзор фреймворка TwistedMaxim Kulsha
 
Using Templates to Achieve Awesomer Architecture
Using Templates to Achieve Awesomer ArchitectureUsing Templates to Achieve Awesomer Architecture
Using Templates to Achieve Awesomer ArchitectureGarann Means
 
MongoDB全機能解説2
MongoDB全機能解説2MongoDB全機能解説2
MongoDB全機能解説2Takahiro Inoue
 
The Ring programming language version 1.3 book - Part 42 of 88
The Ring programming language version 1.3 book - Part 42 of 88The Ring programming language version 1.3 book - Part 42 of 88
The Ring programming language version 1.3 book - Part 42 of 88Mahmoud Samir Fayed
 

Mais procurados (18)

The (unknown) collections module
The (unknown) collections moduleThe (unknown) collections module
The (unknown) collections module
 
Coding Horrors
Coding HorrorsCoding Horrors
Coding Horrors
 
Desarrollo de módulos en Drupal e integración con dispositivos móviles
Desarrollo de módulos en Drupal e integración con dispositivos móvilesDesarrollo de módulos en Drupal e integración con dispositivos móviles
Desarrollo de módulos en Drupal e integración con dispositivos móviles
 
Leveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHPLeveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHP
 
PHP 5.4
PHP 5.4PHP 5.4
PHP 5.4
 
Php 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the GoodPhp 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the Good
 
Leveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHPLeveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHP
 
Saving Gaia with GeoDjango
Saving Gaia with GeoDjangoSaving Gaia with GeoDjango
Saving Gaia with GeoDjango
 
Django101 geodjango
Django101 geodjangoDjango101 geodjango
Django101 geodjango
 
Ansible, voyage au centre de l'automatisation
Ansible, voyage au centre de l'automatisationAnsible, voyage au centre de l'automatisation
Ansible, voyage au centre de l'automatisation
 
Pry, the good parts
Pry, the good partsPry, the good parts
Pry, the good parts
 
PHP Loves MongoDB - Dublin MUG (by Hannes)
PHP Loves MongoDB - Dublin MUG (by Hannes)PHP Loves MongoDB - Dublin MUG (by Hannes)
PHP Loves MongoDB - Dublin MUG (by Hannes)
 
Rapid and Scalable Development with MongoDB, PyMongo, and Ming
Rapid and Scalable Development with MongoDB, PyMongo, and MingRapid and Scalable Development with MongoDB, PyMongo, and Ming
Rapid and Scalable Development with MongoDB, PyMongo, and Ming
 
Обзор фреймворка Twisted
Обзор фреймворка TwistedОбзор фреймворка Twisted
Обзор фреймворка Twisted
 
Using Templates to Achieve Awesomer Architecture
Using Templates to Achieve Awesomer ArchitectureUsing Templates to Achieve Awesomer Architecture
Using Templates to Achieve Awesomer Architecture
 
MongoDB全機能解説2
MongoDB全機能解説2MongoDB全機能解説2
MongoDB全機能解説2
 
The Ring programming language version 1.3 book - Part 42 of 88
The Ring programming language version 1.3 book - Part 42 of 88The Ring programming language version 1.3 book - Part 42 of 88
The Ring programming language version 1.3 book - Part 42 of 88
 
php plus mysql
php plus mysqlphp plus mysql
php plus mysql
 

Semelhante a Ring Cache Decorator for Functions, Methods and Classes

Python在豆瓣的应用
Python在豆瓣的应用Python在豆瓣的应用
Python在豆瓣的应用Qiangning Hong
 
DjangoCon 2010 Scaling Disqus
DjangoCon 2010 Scaling DisqusDjangoCon 2010 Scaling Disqus
DjangoCon 2010 Scaling Disquszeeg
 
Go Web Development
Go Web DevelopmentGo Web Development
Go Web DevelopmentCheng-Yi Yu
 
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)Doris Chen
 
Django Overview
Django OverviewDjango Overview
Django OverviewBrian Tol
 
國民雲端架構 Django + GAE
國民雲端架構 Django + GAE國民雲端架構 Django + GAE
國民雲端架構 Django + GAEWinston Chen
 
Ruby is Awesome
Ruby is AwesomeRuby is Awesome
Ruby is AwesomeAstrails
 
ORM in Go. Internals, tips & tricks
ORM in Go. Internals, tips & tricksORM in Go. Internals, tips & tricks
ORM in Go. Internals, tips & tricksDmytro Istratkin
 
Inside PyMongo - MongoNYC
Inside PyMongo - MongoNYCInside PyMongo - MongoNYC
Inside PyMongo - MongoNYCMike Dirolf
 
MongoDB at ZPUGDC
MongoDB at ZPUGDCMongoDB at ZPUGDC
MongoDB at ZPUGDCMike Dirolf
 
Tame Accidental Complexity with Ruby and MongoMapper
Tame Accidental Complexity with Ruby and MongoMapperTame Accidental Complexity with Ruby and MongoMapper
Tame Accidental Complexity with Ruby and MongoMapperGiordano Scalzo
 
Python Development (MongoSF)
Python Development (MongoSF)Python Development (MongoSF)
Python Development (MongoSF)Mike Dirolf
 

Semelhante a Ring Cache Decorator for Functions, Methods and Classes (20)

Extjs + Gears
Extjs + GearsExtjs + Gears
Extjs + Gears
 
Python在豆瓣的应用
Python在豆瓣的应用Python在豆瓣的应用
Python在豆瓣的应用
 
DjangoCon 2010 Scaling Disqus
DjangoCon 2010 Scaling DisqusDjangoCon 2010 Scaling Disqus
DjangoCon 2010 Scaling Disqus
 
Go Web Development
Go Web DevelopmentGo Web Development
Go Web Development
 
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
 
Django Overview
Django OverviewDjango Overview
Django Overview
 
jQuery for beginners
jQuery for beginnersjQuery for beginners
jQuery for beginners
 
Django cryptography
Django cryptographyDjango cryptography
Django cryptography
 
國民雲端架構 Django + GAE
國民雲端架構 Django + GAE國民雲端架構 Django + GAE
國民雲端架構 Django + GAE
 
Ruby is Awesome
Ruby is AwesomeRuby is Awesome
Ruby is Awesome
 
ORM in Go. Internals, tips & tricks
ORM in Go. Internals, tips & tricksORM in Go. Internals, tips & tricks
ORM in Go. Internals, tips & tricks
 
Performance patterns
Performance patternsPerformance patterns
Performance patterns
 
Inside PyMongo - MongoNYC
Inside PyMongo - MongoNYCInside PyMongo - MongoNYC
Inside PyMongo - MongoNYC
 
Web2.0 with jQuery in English
Web2.0 with jQuery in EnglishWeb2.0 with jQuery in English
Web2.0 with jQuery in English
 
MongoDB at ZPUGDC
MongoDB at ZPUGDCMongoDB at ZPUGDC
MongoDB at ZPUGDC
 
Tame Accidental Complexity with Ruby and MongoMapper
Tame Accidental Complexity with Ruby and MongoMapperTame Accidental Complexity with Ruby and MongoMapper
Tame Accidental Complexity with Ruby and MongoMapper
 
Learning How To Use Jquery #5
Learning How To Use Jquery #5Learning How To Use Jquery #5
Learning How To Use Jquery #5
 
Nodejs - A quick tour (v4)
Nodejs - A quick tour (v4)Nodejs - A quick tour (v4)
Nodejs - A quick tour (v4)
 
Python Development (MongoSF)
Python Development (MongoSF)Python Development (MongoSF)
Python Development (MongoSF)
 
Nodejs - A quick tour (v5)
Nodejs - A quick tour (v5)Nodejs - A quick tour (v5)
Nodejs - A quick tour (v5)
 

Último

Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odishasmiwainfosol
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsAhmed Mohamed
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Velvetech LLC
 
Buds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in NoidaBuds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in Noidabntitsolutionsrishis
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideChristina Lin
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanyChristoph Pohl
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWave PLM
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Andreas Granig
 
CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceBrainSell Technologies
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...soniya singh
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesPhilip Schwarz
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024StefanoLambiase
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackVICTOR MAESTRE RAMIREZ
 
Xen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfXen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfStefano Stabellini
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxTier1 app
 
英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作qr0udbr0
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...OnePlan Solutions
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio, Inc.
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEEVICTOR MAESTRE RAMIREZ
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 

Último (20)

Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML Diagrams
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...
 
Buds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in NoidaBuds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in Noida
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need It
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024
 
CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. Salesforce
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a series
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStack
 
Xen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfXen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdf
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
 
英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEE
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 

Ring Cache Decorator for Functions, Methods and Classes