SlideShare a Scribd company logo
1 of 261
Introduction to Riak
Sean Cribbs



basho
system “whoami”
system “whoami”

BCS (Tulsa), three years as a musician
system “whoami”

BCS (Tulsa), three years as a musician
Started with Ruby in early 2006
system “whoami”

BCS (Tulsa), three years as a musician
Started with Ruby in early 2006
Rails freelancer 2007-2010
system “whoami”

BCS (Tulsa), three years as a musician
Started with Ruby in early 2006
Rails freelancer 2007-2010
Radiant CMS
system “whoami”

BCS (Tulsa), three years as a musician
Started with Ruby in early 2006
Rails freelancer 2007-2010
Radiant CMS
March 2010 - Developer Advocate
                                         basho
Rails Can’t Scale
Rails Can’t Scale
  what does it mean?
Ruby Rails Can’t Scale
        what does it mean?
MySQL
Ruby Rails Can’t Scale
        what does it mean?
insert straw man here


  MySQL
Ruby Rails Can’t Scale
        what does it mean?
Mythbusting “scalability”
Mythbusting “scalability”

 Scalability is not a yes/no question
Mythbusting “scalability”

 Scalability is not a yes/no question
 It’s a ratio of benefit to cost
Mythbusting “scalability”

 Scalability is not a yes/no question
 It’s a ratio of benefit to cost
   Benefits: low latency, throughput, uptime,
   concurrency, reliability
Mythbusting “scalability”

 Scalability is not a yes/no question
 It’s a ratio of benefit to cost
   Benefits: low latency, throughput, uptime,
   concurrency, reliability
   Costs: CPU, RAM, disk, bandwidth, power, hw/sw
Mythbusting “scalability”

 Scalability is not a yes/no question
 It’s a ratio of benefit to cost
   Benefits: low latency, throughput, uptime,
   concurrency, reliability
   Costs: CPU, RAM, disk, bandwidth, power, hw/sw
 scalability = bang for your buck (ROI)
Scaling goes both ways
Scaling goes both ways


Up/Out - high traffic, “Big Data”, multi-datacenter
Scaling goes both ways


Up/Out - high traffic, “Big Data”, multi-datacenter
Down/In - laptop, set-top, mobile
How do you scale?
How do you scale?


Vertically - get bigger, expensive machines
How do you scale?


Vertically - get bigger, expensive machines
Horizontally - get more commodity machines
What is Riak?
     (the horizontal scaling bits)
What is Riak?
       (the horizontal scaling bits)

Based on Amazon’s Dynamo (2007)
What is Riak?
        (the horizontal scaling bits)

Based on Amazon’s Dynamo (2007)
  key-value storage
What is Riak?
        (the horizontal scaling bits)

Based on Amazon’s Dynamo (2007)
  key-value storage
  masterless, peer-to-peer replication
What is Riak?
        (the horizontal scaling bits)

Based on Amazon’s Dynamo (2007)
  key-value storage
  masterless, peer-to-peer replication
  consistent hashing
What is Riak?
        (the horizontal scaling bits)

Based on Amazon’s Dynamo (2007)
  key-value storage
  masterless, peer-to-peer replication
  consistent hashing
  eventual consistency
What is Riak?
        (the horizontal scaling bits)

Based on Amazon’s Dynamo (2007)
  key-value storage
  masterless, peer-to-peer replication
  consistent hashing
  eventual consistency
  failover - quorums, hinted handoff
“O/RM is the Vietnam of Computer Science.”
                       -- Ted Neward, 2004/6
“O/RM is the Vietnam of Computer Science.”
                       -- Ted Neward, 2004/6
     slippery slope
“O/RM is the Vietnam of Computer Science.”
                       -- Ted Neward, 2004/6
     slippery slope   diminishing returns
Impedance mismatch
Impedance mismatch


Relational = predicate logic, truth statements
Impedance mismatch


Relational = predicate logic, truth statements
Object = identity, state, behavior, encapsulation
Pick your poison
Pick your poison

Make the objects fit the database
Pick your poison

Make the objects fit the database
  Active Record
Pick your poison

Make the objects fit the database
  Active Record
Make the database fit the objects
Pick your poison

Make the objects fit the database
  Active Record
Make the database fit the objects
  OODBMS, Graph DBs
Middle ground
Middle ground

Document databases (identity and state)
Middle ground

Document databases (identity and state)
  No JOINs - denormalized / composed
Middle ground

Document databases (identity and state)
  No JOINs - denormalized / composed
  Loosely structured
Middle ground

Document databases (identity and state)
  No JOINs - denormalized / composed
  Loosely structured
  Friendly transport formats, e.g. JSON
What is Riak?
    (the document database bits)
What is Riak?
       (the document database bits)



Store your objects as JSON (or any format)
What is Riak?
       (the document database bits)



Store your objects as JSON (or any format)
Link between objects (like hypertext)
What is Riak?
       (the document database bits)



Store your objects as JSON (or any format)
Link between objects (like hypertext)
No SQL - query with Javascript Map-Reduce
DevOps - agile infrastructure
DevOps - agile infrastructure
     programming your infrastructure
DevOps - agile infrastructure
     programming your infrastructure
    better communication and planning
Befriend your sysadmin
Befriend your sysadmin


Integrate with existing infrastructure
Befriend your sysadmin


Integrate with existing infrastructure
Reduce the amount of hands-on work
Befriend your sysadmin


Integrate with existing infrastructure
Reduce the amount of hands-on work
Have a growth plan
What is Riak?
      (the ops-friendly bits)
What is Riak?
          (the ops-friendly bits)

Web-shaped storage
What is Riak?
            (the ops-friendly bits)

Web-shaped storage
  Store data in its original format
What is Riak?
            (the ops-friendly bits)

Web-shaped storage
  Store data in its original format
  It’s just HTTP - same techniques apply
What is Riak?
            (the ops-friendly bits)

Web-shaped storage
  Store data in its original format
  It’s just HTTP - same techniques apply
    load balancing, proxy caches, round-robin DNS
What is Riak?
            (the ops-friendly bits)

Web-shaped storage
  Store data in its original format
  It’s just HTTP - same techniques apply
    load balancing, proxy caches, round-robin DNS
No node is special - grow horizontally
What is Riak?
            (the ops-friendly bits)

Web-shaped storage
  Store data in its original format
  It’s just HTTP - same techniques apply
    load balancing, proxy caches, round-robin DNS
No node is special - grow horizontally
Get some sleep, fix it in the morning
To review, Riak is...
To review, Riak is...

 Magical Horizontally-
 Scaling Unicorns
To review, Riak is...

 Magical Horizontally-
 Scaling Unicorns
 Application-Friendly
 Rainbows in the Cloud
To review, Riak is...

 Magical Horizontally-
 Scaling Unicorns
 Application-Friendly
 Rainbows in the Cloud
 Data-Shredding
 MapReduce Ninjas
soapbox do
http://www.flickr.com/photos/mullica/2769082212/
http://www.flickr.com/photos/bike/236125877/



Stop Cargo-Culting
You are not 37signals, Twitter, or github.
http://www.flickr.com/photos/library_of_virginia/2898496299/



Ignore the Salesperson
Do your own evaluation. Don’t parrot the hype.
http://bit.ly/cGVPv7



Understand your Data
One size does not fit all. Give up your crutches.
Plan for Failure
Your code is not perfect. Your server will go down.
http://www.solarnavigator.net/animal_kingdom/humans/simon_hall.htm



Take Responsibility
Own your choice. Understand the consequences.
end
Getting Started with Riak
http://192.168.0.87/~sean/riak-training/
Starting up a cluster
Starting up a cluster


 make all devrel
Starting up a cluster


 make all devrel
 dev{1,2,3}/bin/riak start
Starting up a cluster


 make all devrel
 dev{1,2,3}/bin/riak start
 dev{2,3}/bin/riak-admin join dev1@127.0.0.1
Riak CRUD
      http://127.0.0.1:8091/
Riak CRUD
            http://127.0.0.1:8091/

POST /riak/bucket (C - random key)
Riak CRUD
            http://127.0.0.1:8091/

POST /riak/bucket (C - random key)
GET /riak/bucket/key (R)
Riak CRUD
            http://127.0.0.1:8091/

POST /riak/bucket (C - random key)
GET /riak/bucket/key (R)
PUT /riak/bucket/key (U,C - known key)
Riak CRUD
            http://127.0.0.1:8091/

POST /riak/bucket (C - random key)
GET /riak/bucket/key (R)
PUT /riak/bucket/key (U,C - known key)
DELETE /riak/bucket/key (D)
gem install riak-client
  http://192.168.0.87/~sean/riak-training/
require ‘riak’
require ‘riak’
Make a client object
client = Riak::Client.new
require ‘riak’
Make a client object
client = Riak::Client.new

Get a bucket
bucket = client.bucket(‘foo’) # Riak::Bucket
require ‘riak’
Make a client object
client = Riak::Client.new

Get a bucket
bucket = client.bucket(‘foo’) # Riak::Bucket

Get an object from the bucket
obj = bucket.get(‘bar’) # Riak::RObject
require ‘riak’
Make a client object
client = Riak::Client.new

Get a bucket
bucket = client.bucket(‘foo’) # Riak::Bucket

Get an object from the bucket
obj = bucket.get(‘bar’) # Riak::RObject

Initialize a new object
obj = bucket.new(‘baz’)
Riak::RObject
Riak::RObject
Get/set object key
obj.key = “bar”
Riak::RObject
Get/set object key
obj.key = “bar”

Get/set content-type
obj.content_type = ‘application/json’
Riak::RObject
Get/set object key
obj.key = “bar”

Get/set content-type
obj.content_type = ‘application/json’

Get/set the object body data (JSON auto enc/dec)
obj.data = {“name” => “Sean”}
Riak::RObject
Get/set object key
obj.key = “bar”

Get/set content-type
obj.content_type = ‘application/json’

Get/set the object body data (JSON auto enc/dec)
obj.data = {“name” => “Sean”}

Store the object
obj.store
LAB
LAB


Build Riak 3-node developer setup
(install Erlang as necessary)
LAB


Build Riak 3-node developer setup
(install Erlang as necessary)
Store an image in Riak via REST API with curl
LAB


Build Riak 3-node developer setup
(install Erlang as necessary)
Store an image in Riak via REST API with curl
Store a JSON object via Ruby client
Riak Influences
Riak Influences


CAP Theorem
Riak Influences


CAP Theorem
Amazon Dynamo Paper
Riak Influences


CAP Theorem
Amazon Dynamo Paper
Operational experience running large networks
CAP Theorem
CAP Theorem


Consistency - globally consistent state
CAP Theorem


Consistency - globally consistent state
Availability - system accepts reads and writes
CAP Theorem


Consistency - globally consistent state
Availability - system accepts reads and writes
Partition Tolerance - system handles network failure
CAP: Pick two
Riak: Pick two...
     for each operation
Amazon Dynamo
Amazon Dynamo
originally for their shopping cart storage
Amazon Dynamo
originally for their shopping cart storage
masterless, peer-to-peer replication
Amazon Dynamo
originally for their shopping cart storage
masterless, peer-to-peer replication
evenly-distributed key space “ring” (consistent hashing)
Amazon Dynamo
originally for their shopping cart storage
masterless, peer-to-peer replication
evenly-distributed key space “ring” (consistent hashing)
eventually consistent (AP)
Amazon Dynamo
originally for their shopping cart storage
masterless, peer-to-peer replication
evenly-distributed key space “ring” (consistent hashing)
eventually consistent (AP)
robust failure tolerance
Amazon Dynamo
originally for their shopping cart storage
masterless, peer-to-peer replication
evenly-distributed key space “ring” (consistent hashing)
eventually consistent (AP)
robust failure tolerance
hinted handoff
Dynamo Quorums
Dynamo Quorums


N = number of replicas
Dynamo Quorums


N = number of replicas
R = quorum for a successful read
Dynamo Quorums


N = number of replicas
R = quorum for a successful read
W = quorum for a successful write
Dynamo Math
Dynamo Math


N - R = read fault tolerance
Dynamo Math


N - R = read fault tolerance
N - W = write fault tolerance
Dynamo Math
Dynamo Math


N = 4, W = 2, R = 2
Dynamo Math


N = 4, W = 2, R = 2
N - R = 2 (nodes can be down and Riak can still
perform reads)
Dynamo Math


N = 4, W = 2, R = 2
N - R = 2 (nodes can be down and Riak can still
perform reads)
N - W = 2 (nodes that will receive hinted writes)
Riak Improvements




    R=W -- “read your writes consistency”
      R+W > N -- “strong consistency”
Riak Improvements


N can vary per bucket



        R=W -- “read your writes consistency”
          R+W > N -- “strong consistency”
Riak Improvements


N can vary per bucket
R and W can vary per operation


        R=W -- “read your writes consistency”
          R+W > N -- “strong consistency”
Setting N (replication factor)
Setting N (replication factor)

 PUT /riak/bucket
 Content-Type: application/json

 {“props”:{“n_val”:5}}
Setting N (replication factor)

 PUT /riak/bucket
 Content-Type: application/json

 {“props”:{“n_val”:5}}
 bucket.n_value = 5
Request-time quorums
Request-time quorums


GET /riak/bucket/key?r=1
bucket.get(‘key’, :r => 1)
Request-time quorums


GET /riak/bucket/key?r=1
bucket.get(‘key’, :r => 1)
PUT /riak/bucket/key?w=4
object.store(:w => 4)
Other quorums
Other quorums


DW = durable writes (stored to disk)
Other quorums


DW = durable writes (stored to disk)
RW = quorum for deletes (delete is a write!)
LAB
LAB


Change the n_val for a bucket
LAB


Change the n_val for a bucket
Stop a node, test R/W quorums
Links
Links


Simple, one-way relationships between objects
Links


Simple, one-way relationships between objects
Like <a> or <link> tags in HTML
Links


Simple, one-way relationships between objects
Like <a> or <link> tags in HTML
Can be efficiently followed via “link-walking”
The Link Header

     bucket       tag




          key
The Link Header

           bucket                    tag

Link: </riak/demo/test1>; riaktag=”userinfo”


                  key
Links in Ruby API
Links in Ruby API

 Create a link
 Riak::Link.new(“/riak/bucket/key”, “tag”)
Links in Ruby API

 Create a link
 Riak::Link.new(“/riak/bucket/key”, “tag”)

 Read an object’s links
 obj.links # Set<Riak::Link>
Links in Ruby API

 Create a link
 Riak::Link.new(“/riak/bucket/key”, “tag”)

 Read an object’s links
 obj.links # Set<Riak::Link>

 Convert an object to a link
 obj.links << obj2.to_link(“next”)
 obj.store
Link-Walking (traversal)
Link-Walking (traversal)

 Ask Riak to “walk” a sequence of links filtered by
 bucket, tag, or a combination
Link-Walking (traversal)

 Ask Riak to “walk” a sequence of links filtered by
 bucket, tag, or a combination
 Optionally, collect results along the way and return
 them
Link-Walking (traversal)

 Ask Riak to “walk” a sequence of links filtered by
 bucket, tag, or a combination
 Optionally, collect results along the way and return
 them
 Can be arbitrarily deep
Link-Walking (traversal)

 Ask Riak to “walk” a sequence of links filtered by
 bucket, tag, or a combination
 Optionally, collect results along the way and return
 them
 Can be arbitrarily deep
 Response is doubly-nested multipart/mixed
 riak-client handles this for you - Array of Arrays of RObjects
Link-Walking Example
Link-Walking Example

GET /riak/demo/test1/_,_,1

Start at demo/test1, follow all links and return the
objects

obj = client[‘demo’][‘test1’]
obj.walk(:keep => true)
Link-Walking Example
Link-Walking Example

GET /riak/demo/test1/demo,_,1

Start at demo/test1, follow all links pointing to the
demo bucket and return the objects

obj.walk(:bucket => “demo”, :keep => true)
Link-Walking Example
Link-Walking Example

GET /riak/demo/test1/_,friend,1

Start at demo/test1, follow all links tagged “friend”
and return the objects

object.walk(:tag => ‘friend’, :keep => true)
Link-Walking Example
Link-Walking Example

GET /riak/demo/test1/_,_,_/_,_,1

Start at demo/test1, follow all links, follow all links from
those, return everything from the last set

obj.walk({},{:keep => true})
LAB
LAB


Create a network of mutual friends using Ruby:
Justin, Andy, Bryan, Tony
LAB


Create a network of mutual friends using Ruby:
Justin, Andy, Bryan, Tony
Find all of Justin’s friends’ friends via curl
LAB


Create a network of mutual friends using Ruby:
Justin, Andy, Bryan, Tony
Find all of Justin’s friends’ friends via curl
Find all of Tony’s first and second-tier friends in Ruby
Riak Map-Reduce
I believe I did, Bob.
Riak Map-Reduce
Riak Map-Reduce

Based on Google’s Map-Reduce idea
Riak Map-Reduce

Based on Google’s Map-Reduce idea
Some similarities to Hadoop and CouchDB
Riak Map-Reduce

Based on Google’s Map-Reduce idea
Some similarities to Hadoop and CouchDB
High data-locality
Riak Map-Reduce

Based on Google’s Map-Reduce idea
Some similarities to Hadoop and CouchDB
High data-locality
Phases can be Javascript or Erlang
Map-Reduce Terminology
Map-Reduce Terminology

Job: a query, composed of inputs and phases
Map-Reduce Terminology

Job: a query, composed of inputs and phases
Phase: a single map or reduce function application
Map-Reduce Terminology

Job: a query, composed of inputs and phases
Phase: a single map or reduce function application
Map: phase applied to each item - filter, transform
Map-Reduce Terminology

Job: a query, composed of inputs and phases
Phase: a single map or reduce function application
Map: phase applied to each item - filter, transform
Reduce: phase applied to the collection - collate,
aggregate, compute
Map Phases
Map Phases


Inputs are bucket-key pairs (with optional key-specific
data)
Map Phases


Inputs are bucket-key pairs (with optional key-specific
data)
Must return a list
Map Phases


Inputs are bucket-key pairs (with optional key-specific
data)
Must return a list
Parallel results are aggregated
Map Built-ins
Map Built-ins


 Riak.mapValues
Map Built-ins


 Riak.mapValues
 Riak.mapValuesJson
Reduce Phases
Reduce Phases


Performed on a single node
Reduce Phases


Performed on a single node
Two processes per reduce phase increase parallelism
Reduce Phases


Performed on a single node
Two processes per reduce phase increase parallelism
Must return a list
Reduce Built-ins
Reduce Built-ins


 Riak.reduceMin
Reduce Built-ins


 Riak.reduceMin
 Riak.reduceMax
Reduce Built-ins


 Riak.reduceMin
 Riak.reduceMax
 Riak.reduceSort
Build a M/R Job
Build a M/R Job

Specify inputs
Build a M/R Job

Specify inputs
  bucket/key, bucket/key/key-specific-arg, bucket
Build a M/R Job

Specify inputs
  bucket/key, bucket/key/key-specific-arg, bucket
Specify phases
Build a M/R Job

Specify inputs
  bucket/key, bucket/key/key-specific-arg, bucket
Specify phases
  Each can receive a static argument
Build a M/R Job

Specify inputs
  bucket/key, bucket/key/key-specific-arg, bucket
Specify phases
  Each can receive a static argument
  Each can return intermediate results
Map-Reduce on HTTP
Map-Reduce on HTTP


Job is a JSON object
Map-Reduce on HTTP


Job is a JSON object
POST /mapred
A simple M/R job
{“inputs”: “goog”,

“query”: [{“map”:

         {“language”:”javascript”,

          “name”: “Riak.mapValuesJson”,

                     “keep”: true}]}
A simple M/R job
{“inputs”: “goog”,

“query”: [{“map”:

         {“language”:”javascript”,

          “name”: “Riak.mapValuesJson”,

                     “keep”: true}]}


 Riak::MapReduce.new(c).add(‘goog’).
        map(‘Riak.mapValuesJson’, :keep => true).run
Another M/R Job
Another M/R Job
 {“inputs”: “goog”,
Another M/R Job
 {“inputs”: “goog”,
 “query”: [{“map”:{“language”:”javascript”,
Another M/R Job
 {“inputs”: “goog”,
 “query”: [{“map”:{“language”:”javascript”,
             “name”: “App.findHighGreater”,
Another M/R Job
 {“inputs”: “goog”,
 “query”: [{“map”:{“language”:”javascript”,
             “name”: “App.findHighGreater”,
             “arg”: 600.0,
Another M/R Job
 {“inputs”: “goog”,
 “query”: [{“map”:{“language”:”javascript”,
             “name”: “App.findHighGreater”,
             “arg”: 600.0,
             “keep”: false},
Another M/R Job
 {“inputs”: “goog”,
 “query”: [{“map”:{“language”:”javascript”,
             “name”: “App.findHighGreater”,
             “arg”: 600.0,
             “keep”: false},
        {“reduce”:{“language”:”javascript,
Another M/R Job
 {“inputs”: “goog”,
 “query”: [{“map”:{“language”:”javascript”,
             “name”: “App.findHighGreater”,
             “arg”: 600.0,
             “keep”: false},
        {“reduce”:{“language”:”javascript,
               “name”: “Riak.reduceMax”,
Another M/R Job
 {“inputs”: “goog”,
 “query”: [{“map”:{“language”:”javascript”,
             “name”: “App.findHighGreater”,
             “arg”: 600.0,
             “keep”: false},
        {“reduce”:{“language”:”javascript,
               “name”: “Riak.reduceMax”,
               “keep”: true}]}
Another M/R Job
 {“inputs”: “goog”,
 “query”: [{“map”:{“language”:”javascript”,
             “name”: “App.findHighGreater”,
             “arg”: 600.0,
             “keep”: false},
        {“reduce”:{“language”:”javascript,
               “name”: “Riak.reduceMax”,
               “keep”: true}]}

Riak::MapReduce.new(c).add(‘goog’).
       map(‘App.findHighGreater’, :arg => 600.0).
       reduce(“Riak.reduceMax”, :keep => true).run
LAB
LAB

Load the Google historical stock data
LAB

Load the Google historical stock data
Use Map-Reduce to:
LAB

Load the Google historical stock data
Use Map-Reduce to:
  Find the highest high price in the first week of March
LAB

Load the Google historical stock data
Use Map-Reduce to:
  Find the highest high price in the first week of March
  Find the day with the widest price range since the
  beginning of the year
Ripple
         gem install ripple
Ripple
              gem install ripple
Document-style persistence/modeling library
Ripple
              gem install ripple
Document-style persistence/modeling library
ActiveModel niceties
Ripple
              gem install ripple
Document-style persistence/modeling library
ActiveModel niceties
  Callbacks
Ripple
                gem install ripple
Document-style persistence/modeling library
ActiveModel niceties
  Callbacks
  Validations
Ripple
                gem install ripple
Document-style persistence/modeling library
ActiveModel niceties
  Callbacks
  Validations
  ActionPack compatibility
Ripple Roadmap
Ripple Roadmap

Associations
Ripple Roadmap

Associations
Indexes
Ripple Roadmap

Associations
Indexes
Use a property/method as the key
Ripple Roadmap

Associations
Indexes
Use a property/method as the key
Dynamic finders
Ripple Roadmap

Associations
Indexes
Use a property/method as the key
Dynamic finders
Session store
Create a Ripple::Document
Create a Ripple::Document


class Person
 include Ripple::Document

 property :name, String, :presence => true
end
Sample app walkthrough
Sample app walkthrough



http://github.com/seancribbs/riak-url-shortener
Create a shortened URL
Create a shortened URL
post '/' do
Create a shortened URL
post '/' do
 client = Riak::Client.new
Create a shortened URL
post '/' do
 client = Riak::Client.new
 key = create_shortcode.call(params[:url])
Create a shortened URL
post '/' do
 client = Riak::Client.new
 key = create_shortcode.call(params[:url])
 bucket = Riak::Bucket.new(client, 'urls')
Create a shortened URL
post '/' do
 client = Riak::Client.new
 key = create_shortcode.call(params[:url])
 bucket = Riak::Bucket.new(client, 'urls')
 Riak::RObject.new(bucket, key).tap do |obj|
Create a shortened URL
post '/' do
 client = Riak::Client.new
 key = create_shortcode.call(params[:url])
 bucket = Riak::Bucket.new(client, 'urls')
 Riak::RObject.new(bucket, key).tap do |obj|
  obj.content_type = "text/plain"
Create a shortened URL
post '/' do
 client = Riak::Client.new
 key = create_shortcode.call(params[:url])
 bucket = Riak::Bucket.new(client, 'urls')
 Riak::RObject.new(bucket, key).tap do |obj|
  obj.content_type = "text/plain"
  obj.data = params[:url]
Create a shortened URL
post '/' do
 client = Riak::Client.new
 key = create_shortcode.call(params[:url])
 bucket = Riak::Bucket.new(client, 'urls')
 Riak::RObject.new(bucket, key).tap do |obj|
  obj.content_type = "text/plain"
  obj.data = params[:url]
  obj.store
Create a shortened URL
post '/' do
 client = Riak::Client.new
 key = create_shortcode.call(params[:url])
 bucket = Riak::Bucket.new(client, 'urls')
 Riak::RObject.new(bucket, key).tap do |obj|
  obj.content_type = "text/plain"
  obj.data = params[:url]
  obj.store
 end
Create a shortened URL
post '/' do
 client = Riak::Client.new
 key = create_shortcode.call(params[:url])
 bucket = Riak::Bucket.new(client, 'urls')
 Riak::RObject.new(bucket, key).tap do |obj|
  obj.content_type = "text/plain"
  obj.data = params[:url]
  obj.store
 end
 status 201
 @url = "http://#{request.host_with_port}/#{key}"
 headers "Location" => @url
 haml :created
end
Embiggen the short URL
Embiggen the short URL
get '/:code' do
 begin
  client = Riak::Client.new
Embiggen the short URL
get '/:code' do
 begin
  client = Riak::Client.new
  obj = Riak::Bucket.new(client, 'urls').get(params[:code])
Embiggen the short URL
get '/:code' do
 begin
  client = Riak::Client.new
  obj = Riak::Bucket.new(client, 'urls').get(params[:code])
  url = obj.data
Embiggen the short URL
get '/:code' do
 begin
  client = Riak::Client.new
  obj = Riak::Bucket.new(client, 'urls').get(params[:code])
  url = obj.data
  halt 301, {"Location" => url}, []
Embiggen the short URL
get '/:code' do
 begin
  client = Riak::Client.new
  obj = Riak::Bucket.new(client, 'urls').get(params[:code])
  url = obj.data
  halt 301, {"Location" => url}, []
 rescue Riak::FailedRequest => fr
  case fr.code
  when 404
    not_found(haml(:not_found))
  when 500..599
    error(503, haml(:error))
  end
 end
end
fin
sean@basho.com
                             @seancribbs
       “seancribbs” on Freenode IRC #riak




Questions?
                     http://wiki.basho.com
               riak-users@lists.basho.com

More Related Content

What's hot

Riak - From Small to Large
Riak - From Small to LargeRiak - From Small to Large
Riak - From Small to LargeRusty Klophaus
 
Hadoop, Hive, Spark and Object Stores
Hadoop, Hive, Spark and Object StoresHadoop, Hive, Spark and Object Stores
Hadoop, Hive, Spark and Object StoresSteve Loughran
 
Why your Spark Job is Failing
Why your Spark Job is FailingWhy your Spark Job is Failing
Why your Spark Job is FailingDataWorks Summit
 
Deploying Apache Flume to enable low-latency analytics
Deploying Apache Flume to enable low-latency analyticsDeploying Apache Flume to enable low-latency analytics
Deploying Apache Flume to enable low-latency analyticsDataWorks Summit
 
Harnessing the power of Nutch with Scala
Harnessing the power of Nutch with ScalaHarnessing the power of Nutch with Scala
Harnessing the power of Nutch with ScalaKnoldus Inc.
 
Scaling Spark Workloads on YARN - Boulder/Denver July 2015
Scaling Spark Workloads on YARN - Boulder/Denver July 2015Scaling Spark Workloads on YARN - Boulder/Denver July 2015
Scaling Spark Workloads on YARN - Boulder/Denver July 2015Mac Moore
 
Analytics with Cassandra & Spark
Analytics with Cassandra & SparkAnalytics with Cassandra & Spark
Analytics with Cassandra & SparkMatthias Niehoff
 
Terracotta's OffHeap Explained
Terracotta's OffHeap ExplainedTerracotta's OffHeap Explained
Terracotta's OffHeap ExplainedChris Dennis
 
How to build your query engine in spark
How to build your query engine in sparkHow to build your query engine in spark
How to build your query engine in sparkPeng Cheng
 
Constructing Web APIs with Rack, Sinatra and MongoDB
Constructing Web APIs with Rack, Sinatra and MongoDBConstructing Web APIs with Rack, Sinatra and MongoDB
Constructing Web APIs with Rack, Sinatra and MongoDBOisin Hurley
 
Meet Up - Spark Stream Processing + Kafka
Meet Up - Spark Stream Processing + KafkaMeet Up - Spark Stream Processing + Kafka
Meet Up - Spark Stream Processing + KafkaKnoldus Inc.
 
Introduction to Apache ZooKeeper
Introduction to Apache ZooKeeperIntroduction to Apache ZooKeeper
Introduction to Apache ZooKeeperknowbigdata
 
Apache Spark Introduction | Big Data Hadoop Spark Tutorial | CloudxLab
Apache Spark Introduction | Big Data Hadoop Spark Tutorial | CloudxLabApache Spark Introduction | Big Data Hadoop Spark Tutorial | CloudxLab
Apache Spark Introduction | Big Data Hadoop Spark Tutorial | CloudxLabCloudxLab
 
Maximum Overdrive: Tuning the Spark Cassandra Connector
Maximum Overdrive: Tuning the Spark Cassandra ConnectorMaximum Overdrive: Tuning the Spark Cassandra Connector
Maximum Overdrive: Tuning the Spark Cassandra ConnectorRussell Spitzer
 
ELK Ruminating on Logs (Zendcon 2016)
ELK Ruminating on Logs (Zendcon 2016)ELK Ruminating on Logs (Zendcon 2016)
ELK Ruminating on Logs (Zendcon 2016)Mathew Beane
 
Habits of Effective Sqoop Users
Habits of Effective Sqoop UsersHabits of Effective Sqoop Users
Habits of Effective Sqoop UsersKathleen Ting
 
Building Distributed Systems in Scala
Building Distributed Systems in ScalaBuilding Distributed Systems in Scala
Building Distributed Systems in ScalaAlex Payne
 

What's hot (20)

Cloudera Impala
Cloudera ImpalaCloudera Impala
Cloudera Impala
 
Riak - From Small to Large
Riak - From Small to LargeRiak - From Small to Large
Riak - From Small to Large
 
Hadoop, Hive, Spark and Object Stores
Hadoop, Hive, Spark and Object StoresHadoop, Hive, Spark and Object Stores
Hadoop, Hive, Spark and Object Stores
 
Why your Spark Job is Failing
Why your Spark Job is FailingWhy your Spark Job is Failing
Why your Spark Job is Failing
 
Debugging Apache Spark
Debugging Apache SparkDebugging Apache Spark
Debugging Apache Spark
 
Deploying Apache Flume to enable low-latency analytics
Deploying Apache Flume to enable low-latency analyticsDeploying Apache Flume to enable low-latency analytics
Deploying Apache Flume to enable low-latency analytics
 
Harnessing the power of Nutch with Scala
Harnessing the power of Nutch with ScalaHarnessing the power of Nutch with Scala
Harnessing the power of Nutch with Scala
 
Scaling Spark Workloads on YARN - Boulder/Denver July 2015
Scaling Spark Workloads on YARN - Boulder/Denver July 2015Scaling Spark Workloads on YARN - Boulder/Denver July 2015
Scaling Spark Workloads on YARN - Boulder/Denver July 2015
 
Analytics with Cassandra & Spark
Analytics with Cassandra & SparkAnalytics with Cassandra & Spark
Analytics with Cassandra & Spark
 
Os riak1-pdf
Os riak1-pdfOs riak1-pdf
Os riak1-pdf
 
Terracotta's OffHeap Explained
Terracotta's OffHeap ExplainedTerracotta's OffHeap Explained
Terracotta's OffHeap Explained
 
How to build your query engine in spark
How to build your query engine in sparkHow to build your query engine in spark
How to build your query engine in spark
 
Constructing Web APIs with Rack, Sinatra and MongoDB
Constructing Web APIs with Rack, Sinatra and MongoDBConstructing Web APIs with Rack, Sinatra and MongoDB
Constructing Web APIs with Rack, Sinatra and MongoDB
 
Meet Up - Spark Stream Processing + Kafka
Meet Up - Spark Stream Processing + KafkaMeet Up - Spark Stream Processing + Kafka
Meet Up - Spark Stream Processing + Kafka
 
Introduction to Apache ZooKeeper
Introduction to Apache ZooKeeperIntroduction to Apache ZooKeeper
Introduction to Apache ZooKeeper
 
Apache Spark Introduction | Big Data Hadoop Spark Tutorial | CloudxLab
Apache Spark Introduction | Big Data Hadoop Spark Tutorial | CloudxLabApache Spark Introduction | Big Data Hadoop Spark Tutorial | CloudxLab
Apache Spark Introduction | Big Data Hadoop Spark Tutorial | CloudxLab
 
Maximum Overdrive: Tuning the Spark Cassandra Connector
Maximum Overdrive: Tuning the Spark Cassandra ConnectorMaximum Overdrive: Tuning the Spark Cassandra Connector
Maximum Overdrive: Tuning the Spark Cassandra Connector
 
ELK Ruminating on Logs (Zendcon 2016)
ELK Ruminating on Logs (Zendcon 2016)ELK Ruminating on Logs (Zendcon 2016)
ELK Ruminating on Logs (Zendcon 2016)
 
Habits of Effective Sqoop Users
Habits of Effective Sqoop UsersHabits of Effective Sqoop Users
Habits of Effective Sqoop Users
 
Building Distributed Systems in Scala
Building Distributed Systems in ScalaBuilding Distributed Systems in Scala
Building Distributed Systems in Scala
 

Similar to Introduction to Riak - Red Dirt Ruby Conf Training

Embrace NoSQL and Eventual Consistency with Ripple
Embrace NoSQL and Eventual Consistency with RippleEmbrace NoSQL and Eventual Consistency with Ripple
Embrace NoSQL and Eventual Consistency with RippleSean Cribbs
 
Riak at Engine Yard Cloud
Riak at Engine Yard CloudRiak at Engine Yard Cloud
Riak at Engine Yard CloudInes Sombra
 
Introduction to Riak and Ripple (KC.rb)
Introduction to Riak and Ripple (KC.rb)Introduction to Riak and Ripple (KC.rb)
Introduction to Riak and Ripple (KC.rb)Sean Cribbs
 
Introducing Riak
Introducing RiakIntroducing Riak
Introducing RiakKevin Smith
 
Riak from Small to Large
Riak from Small to LargeRiak from Small to Large
Riak from Small to LargeRusty Klophaus
 
Getting Started with Riak - NoSQL Live 2010 - Boston
Getting Started with Riak - NoSQL Live 2010 - BostonGetting Started with Riak - NoSQL Live 2010 - Boston
Getting Started with Riak - NoSQL Live 2010 - BostonRusty Klophaus
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDBJustin Smestad
 
Evolving Archetecture
Evolving ArchetectureEvolving Archetecture
Evolving Archetectureleo lapworth
 
Introduction of Big data, NoSQL & Hadoop
Introduction of Big data, NoSQL & HadoopIntroduction of Big data, NoSQL & Hadoop
Introduction of Big data, NoSQL & HadoopSavvycom Savvycom
 
Microservices and Teraflops: Effortlessly Scaling Data Science with PyWren wi...
Microservices and Teraflops: Effortlessly Scaling Data Science with PyWren wi...Microservices and Teraflops: Effortlessly Scaling Data Science with PyWren wi...
Microservices and Teraflops: Effortlessly Scaling Data Science with PyWren wi...Databricks
 
Events and metrics the Lifeblood of Webops
Events and metrics the Lifeblood of WebopsEvents and metrics the Lifeblood of Webops
Events and metrics the Lifeblood of WebopsDatadog
 
Building a massively scalabale cloud service from grounds up
Building a massively scalabale cloud service from grounds upBuilding a massively scalabale cloud service from grounds up
Building a massively scalabale cloud service from grounds upBaruch Sadogursky
 
NoSQL: Why, When, and How
NoSQL: Why, When, and HowNoSQL: Why, When, and How
NoSQL: Why, When, and HowBigBlueHat
 
Riak at The NYC Cloud Computing Meetup Group
Riak at The NYC Cloud Computing Meetup GroupRiak at The NYC Cloud Computing Meetup Group
Riak at The NYC Cloud Computing Meetup Groupsiculars
 
Cloud Computing & Scaling Web Apps
Cloud Computing & Scaling Web AppsCloud Computing & Scaling Web Apps
Cloud Computing & Scaling Web AppsMark Slingsby
 
Rapid API Development with LoopBack/StrongLoop
Rapid API Development with LoopBack/StrongLoopRapid API Development with LoopBack/StrongLoop
Rapid API Development with LoopBack/StrongLoopRaymond Camden
 
The Graph Database Universe: Neo4j Overview
The Graph Database Universe: Neo4j OverviewThe Graph Database Universe: Neo4j Overview
The Graph Database Universe: Neo4j OverviewNeo4j
 
AWS Innovate: Running Databases in AWS- Russell Nash
AWS Innovate: Running Databases in AWS- Russell NashAWS Innovate: Running Databases in AWS- Russell Nash
AWS Innovate: Running Databases in AWS- Russell NashAmazon Web Services Korea
 

Similar to Introduction to Riak - Red Dirt Ruby Conf Training (20)

Embrace NoSQL and Eventual Consistency with Ripple
Embrace NoSQL and Eventual Consistency with RippleEmbrace NoSQL and Eventual Consistency with Ripple
Embrace NoSQL and Eventual Consistency with Ripple
 
Riak at Engine Yard Cloud
Riak at Engine Yard CloudRiak at Engine Yard Cloud
Riak at Engine Yard Cloud
 
Introduction to Riak and Ripple (KC.rb)
Introduction to Riak and Ripple (KC.rb)Introduction to Riak and Ripple (KC.rb)
Introduction to Riak and Ripple (KC.rb)
 
Introducing Riak
Introducing RiakIntroducing Riak
Introducing Riak
 
Riak from Small to Large
Riak from Small to LargeRiak from Small to Large
Riak from Small to Large
 
Getting Started with Riak - NoSQL Live 2010 - Boston
Getting Started with Riak - NoSQL Live 2010 - BostonGetting Started with Riak - NoSQL Live 2010 - Boston
Getting Started with Riak - NoSQL Live 2010 - Boston
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
 
Evolving Archetecture
Evolving ArchetectureEvolving Archetecture
Evolving Archetecture
 
Introduction of Big data, NoSQL & Hadoop
Introduction of Big data, NoSQL & HadoopIntroduction of Big data, NoSQL & Hadoop
Introduction of Big data, NoSQL & Hadoop
 
Microservices and Teraflops: Effortlessly Scaling Data Science with PyWren wi...
Microservices and Teraflops: Effortlessly Scaling Data Science with PyWren wi...Microservices and Teraflops: Effortlessly Scaling Data Science with PyWren wi...
Microservices and Teraflops: Effortlessly Scaling Data Science with PyWren wi...
 
Events and metrics the Lifeblood of Webops
Events and metrics the Lifeblood of WebopsEvents and metrics the Lifeblood of Webops
Events and metrics the Lifeblood of Webops
 
Building a massively scalabale cloud service from grounds up
Building a massively scalabale cloud service from grounds upBuilding a massively scalabale cloud service from grounds up
Building a massively scalabale cloud service from grounds up
 
Ruby On Rails
Ruby On RailsRuby On Rails
Ruby On Rails
 
NoSQL: Why, When, and How
NoSQL: Why, When, and HowNoSQL: Why, When, and How
NoSQL: Why, When, and How
 
Riak at The NYC Cloud Computing Meetup Group
Riak at The NYC Cloud Computing Meetup GroupRiak at The NYC Cloud Computing Meetup Group
Riak at The NYC Cloud Computing Meetup Group
 
Cloud Computing & Scaling Web Apps
Cloud Computing & Scaling Web AppsCloud Computing & Scaling Web Apps
Cloud Computing & Scaling Web Apps
 
Rapid API Development with LoopBack/StrongLoop
Rapid API Development with LoopBack/StrongLoopRapid API Development with LoopBack/StrongLoop
Rapid API Development with LoopBack/StrongLoop
 
Ruby - The Hard Bits
Ruby - The Hard BitsRuby - The Hard Bits
Ruby - The Hard Bits
 
The Graph Database Universe: Neo4j Overview
The Graph Database Universe: Neo4j OverviewThe Graph Database Universe: Neo4j Overview
The Graph Database Universe: Neo4j Overview
 
AWS Innovate: Running Databases in AWS- Russell Nash
AWS Innovate: Running Databases in AWS- Russell NashAWS Innovate: Running Databases in AWS- Russell Nash
AWS Innovate: Running Databases in AWS- Russell Nash
 

More from Sean Cribbs

Eventually Consistent Data Structures (from strangeloop12)
Eventually Consistent Data Structures (from strangeloop12)Eventually Consistent Data Structures (from strangeloop12)
Eventually Consistent Data Structures (from strangeloop12)Sean Cribbs
 
Eventually-Consistent Data Structures
Eventually-Consistent Data StructuresEventually-Consistent Data Structures
Eventually-Consistent Data StructuresSean Cribbs
 
A Case of Accidental Concurrency
A Case of Accidental ConcurrencyA Case of Accidental Concurrency
A Case of Accidental ConcurrencySean Cribbs
 
Riak with node.js
Riak with node.jsRiak with node.js
Riak with node.jsSean Cribbs
 
Schema Design for Riak (Take 2)
Schema Design for Riak (Take 2)Schema Design for Riak (Take 2)
Schema Design for Riak (Take 2)Sean Cribbs
 
Riak (Øredev nosql day)
Riak (Øredev nosql day)Riak (Øredev nosql day)
Riak (Øredev nosql day)Sean Cribbs
 
Riak Tutorial (Øredev)
Riak Tutorial (Øredev)Riak Tutorial (Øredev)
Riak Tutorial (Øredev)Sean Cribbs
 
The Radiant Ethic
The Radiant EthicThe Radiant Ethic
The Radiant EthicSean Cribbs
 
Schema Design for Riak
Schema Design for RiakSchema Design for Riak
Schema Design for RiakSean Cribbs
 
Introducing Riak and Ripple
Introducing Riak and RippleIntroducing Riak and Ripple
Introducing Riak and RippleSean Cribbs
 
Round PEG, Round Hole - Parsing Functionally
Round PEG, Round Hole - Parsing FunctionallyRound PEG, Round Hole - Parsing Functionally
Round PEG, Round Hole - Parsing FunctionallySean Cribbs
 
Story Driven Development With Cucumber
Story Driven Development With CucumberStory Driven Development With Cucumber
Story Driven Development With CucumberSean Cribbs
 
Achieving Parsing Sanity In Erlang
Achieving Parsing Sanity In ErlangAchieving Parsing Sanity In Erlang
Achieving Parsing Sanity In ErlangSean Cribbs
 
Of Rats And Dragons
Of Rats And DragonsOf Rats And Dragons
Of Rats And DragonsSean Cribbs
 
Erlang/OTP for Rubyists
Erlang/OTP for RubyistsErlang/OTP for Rubyists
Erlang/OTP for RubyistsSean Cribbs
 
Content Management That Won't Rot Your Brain
Content Management That Won't Rot Your BrainContent Management That Won't Rot Your Brain
Content Management That Won't Rot Your BrainSean Cribbs
 

More from Sean Cribbs (17)

Eventually Consistent Data Structures (from strangeloop12)
Eventually Consistent Data Structures (from strangeloop12)Eventually Consistent Data Structures (from strangeloop12)
Eventually Consistent Data Structures (from strangeloop12)
 
Eventually-Consistent Data Structures
Eventually-Consistent Data StructuresEventually-Consistent Data Structures
Eventually-Consistent Data Structures
 
A Case of Accidental Concurrency
A Case of Accidental ConcurrencyA Case of Accidental Concurrency
A Case of Accidental Concurrency
 
Riak with node.js
Riak with node.jsRiak with node.js
Riak with node.js
 
Schema Design for Riak (Take 2)
Schema Design for Riak (Take 2)Schema Design for Riak (Take 2)
Schema Design for Riak (Take 2)
 
Riak (Øredev nosql day)
Riak (Øredev nosql day)Riak (Øredev nosql day)
Riak (Øredev nosql day)
 
Riak Tutorial (Øredev)
Riak Tutorial (Øredev)Riak Tutorial (Øredev)
Riak Tutorial (Øredev)
 
The Radiant Ethic
The Radiant EthicThe Radiant Ethic
The Radiant Ethic
 
Riak with Rails
Riak with RailsRiak with Rails
Riak with Rails
 
Schema Design for Riak
Schema Design for RiakSchema Design for Riak
Schema Design for Riak
 
Introducing Riak and Ripple
Introducing Riak and RippleIntroducing Riak and Ripple
Introducing Riak and Ripple
 
Round PEG, Round Hole - Parsing Functionally
Round PEG, Round Hole - Parsing FunctionallyRound PEG, Round Hole - Parsing Functionally
Round PEG, Round Hole - Parsing Functionally
 
Story Driven Development With Cucumber
Story Driven Development With CucumberStory Driven Development With Cucumber
Story Driven Development With Cucumber
 
Achieving Parsing Sanity In Erlang
Achieving Parsing Sanity In ErlangAchieving Parsing Sanity In Erlang
Achieving Parsing Sanity In Erlang
 
Of Rats And Dragons
Of Rats And DragonsOf Rats And Dragons
Of Rats And Dragons
 
Erlang/OTP for Rubyists
Erlang/OTP for RubyistsErlang/OTP for Rubyists
Erlang/OTP for Rubyists
 
Content Management That Won't Rot Your Brain
Content Management That Won't Rot Your BrainContent Management That Won't Rot Your Brain
Content Management That Won't Rot Your Brain
 

Recently uploaded

The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfPrecisely
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 

Recently uploaded (20)

The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 

Introduction to Riak - Red Dirt Ruby Conf Training

Editor's Notes