SlideShare uma empresa Scribd logo
1 de 184
Baixar para ler offline
on rails
railscamp hamburg, 2010
jan krutisch <jan@krutisch.de>
http://jan.krutisch.de/
Samstag, 23. Oktober 2010
mongodb wtf? lol!?
Samstag, 23. Oktober 2010
document database
Samstag, 23. Oktober 2010
document database
NoSQLincluded!
Samstag, 23. Oktober 2010
10gen
Samstag, 23. Oktober 2010
open source
http://github.com/mongodb/mongo
Samstag, 23. Oktober 2010
id title descr pos_lat pos_lng
Samstag, 23. Oktober 2010
{
"_id" : ObjectId("4c00245062610475a005afcd"),
"address" : "Bernstorffstr. 174n22767 HamburgnDE",
"description" : null,
"position" : {
"lat" : 53.5600912,
"lng" : 9.9596977
},
"tags" : [
"hausarzt",
"naturheilverfahren",
"akupunktur",
"allgemeinmedizin"
],
"title" : "Dr. med. Lilo Eisenbarth",
"loxicon_id" : 808261
}
Samstag, 23. Oktober 2010
Samstag, 23. Oktober 2010
✗Samstag, 23. Oktober 2010
Samstag, 23. Oktober 2010
BSON
Samstag, 23. Oktober 2010
BInary Serialized jsON
http://bsonspec.org/
Samstag, 23. Oktober 2010
Wire
Samstag, 23. Oktober 2010
Storage
Samstag, 23. Oktober 2010
rich queries
Samstag, 23. Oktober 2010
conceptually close to SQL
Samstag, 23. Oktober 2010
easy to grasp
Samstag, 23. Oktober 2010
flexible
Samstag, 23. Oktober 2010
language integration
Samstag, 23. Oktober 2010
on top: map/reduce
Samstag, 23. Oktober 2010
Scaling
Samstag, 23. Oktober 2010
Master/Slave replication
Samstag, 23. Oktober 2010
Replica Sets (1.6)
Samstag, 23. Oktober 2010
Primary
Member Member
Samstag, 23. Oktober 2010
Primary
Member Primary
Samstag, 23. Oktober 2010
Member
Member Primary
Samstag, 23. Oktober 2010
Autosharding (1.6)
Samstag, 23. Oktober 2010
Samstag, 23. Oktober 2010
Durability
Samstag, 23. Oktober 2010
No single server
durability!
Samstag, 23. Oktober 2010
fsyncs every 60s
(configurable)
Samstag, 23. Oktober 2010
Use Replication!
Samstag, 23. Oktober 2010
Use write propagation
locking
Samstag, 23. Oktober 2010
Single Server Durability
planned for 1.8
Samstag, 23. Oktober 2010
mongo console
Samstag, 23. Oktober 2010
$ mongo
Samstag, 23. Oktober 2010
> use test
switched to db test
db.quotes.save({
text: "You can observe a lot just by watching.",
from: "Yogi Berra", created_at: new Date()
});
db.quotes.save({
text: "Silence is one of the hardest arguments to refute.",
from: "Josh Billings", created_at: new Date()
});
Samstag, 23. Oktober 2010
> use test
switched to db test
db.quotes.save({
text: "You can observe a lot just by watching.",
from: "Yogi Berra", created_at: new Date()
});
db.quotes.save({
text: "Silence is one of the hardest arguments to refute.",
from: "Josh Billings", created_at: new Date()
});
Samstag, 23. Oktober 2010
Indexing
Samstag, 23. Oktober 2010
Same concept as with
SQL databases
Samstag, 23. Oktober 2010
You want them
Samstag, 23. Oktober 2010
Same concept as with
SQL databases
Samstag, 23. Oktober 2010
Sort order
Samstag, 23. Oktober 2010
Unique
Samstag, 23. Oktober 2010
Compound
Samstag, 23. Oktober 2010
Geospatial
Samstag, 23. Oktober 2010
map/reduce
Samstag, 23. Oktober 2010
we can haz it, too
Samstag, 23. Oktober 2010
function() {
this.tags.forEach(function(z) {
emit(z, {count: 1});
});
}
Samstag, 23. Oktober 2010
function(key, values) {
var total = 0;
values.forEach(function(v) { total += v.count });
return {count: total}
}
Samstag, 23. Oktober 2010
(it‘s not fast...)
Samstag, 23. Oktober 2010
security
Samstag, 23. Oktober 2010
simple user/password
auth
Samstag, 23. Oktober 2010
per database
Samstag, 23. Oktober 2010
read only is possible
Samstag, 23. Oktober 2010
one more thing
Samstag, 23. Oktober 2010
GridFS
Samstag, 23. Oktober 2010
Binary fields in BSON
< 4MB
Samstag, 23. Oktober 2010
GridFS saves files in
chunks
Samstag, 23. Oktober 2010
I‘m in u‘r rubies,
querying teh MongoDB!
Samstag, 23. Oktober 2010
core driver
Samstag, 23. Oktober 2010
mongo / bson_ext
Samstag, 23. Oktober 2010
ODMs / Libs
Samstag, 23. Oktober 2010
mongo_mapper
Samstag, 23. Oktober 2010
mongoid
Samstag, 23. Oktober 2010
Find examples here:
http://github.com/halfbyte/mongo_ruby_examples
Samstag, 23. Oktober 2010
Basic driver usage
Samstag, 23. Oktober 2010
init
Samstag, 23. Oktober 2010
require 'mongo'
@connection = Mongo::Connection.new
@db = @connection.db("test")
Samstag, 23. Oktober 2010
@connection = Mongo::Connection.new(
'localhost',
27017,
:pool_size => 5,
:timeout => 20
)
Samstag, 23. Oktober 2010
@connection = Mongo::Connection.from_uri(
"mongodb://localhost:27017/test"
)
Samstag, 23. Oktober 2010
insert/upsert
Samstag, 23. Oktober 2010
doc = {
:text => "You can observe a lot just by watching.",
:from => "Yogi Berra",
:created_at => Time.now
}
@db['quotes'].insert(doc)
Samstag, 23. Oktober 2010
doc = @db['quotes'].find_one(id)
doc[:from] = "Yogi Berra, famous baseball player"
@db['quotes'].save(doc)
Samstag, 23. Oktober 2010
atomic updates
Samstag, 23. Oktober 2010
@db['quotes'].update(
{"from" => "Yogi Berra"},
{"$inc" => {"reads" => 1 } }
)
Samstag, 23. Oktober 2010
@db['quotes'].update(
{"from" => "Yogi Berra"},
{"$inc" => {"reads" => 1 } }
)
Samstag, 23. Oktober 2010
$inc
$set
$unset
$push
$pushAll
$addToSet
$pop
$pull
$pullAll
$
Samstag, 23. Oktober 2010
getting a whole collection
Samstag, 23. Oktober 2010
@db['quotes'].find.each do |row|
puts row.inspect
end
Samstag, 23. Oktober 2010
exact query
Samstag, 23. Oktober 2010
@db['quotes'].find(:from => "Yogi Berra")
Samstag, 23. Oktober 2010
more queries
Samstag, 23. Oktober 2010
100.times do |i|
db['numbers'].insert({"i" => i})
end
Samstag, 23. Oktober 2010
db['numbers'].find("i" => {"$lt" => 2})
Samstag, 23. Oktober 2010
$lt <
$gt >
$lte <=
$gte >=
$ne !=
Samstag, 23. Oktober 2010
@db['people'].find(:tags => {"$in" => ['cool']})
Samstag, 23. Oktober 2010
obj = {
"_id"=>BSON::ObjectID('4c706af16261040680000369'),
"name"=>"Vernon Kreiger",
"address"=>{
"street"=>"536 Haleigh Locks",
"city"=>"Port Kiannahaven",
"zip"=>"80730-0214",
"country"=>"Fakistan"
},
"tags"=>["cool", "weird"]
}
Samstag, 23. Oktober 2010
obj = {
"_id"=>BSON::ObjectID('4c706af16261040680000369'),
"name"=>"Vernon Kreiger",
"address"=>{
"street"=>"536 Haleigh Locks",
"city"=>"Port Kiannahaven",
"zip"=>"80730-0214",
"country"=>"Fakistan"
},
"tags"=>["cool", "weird"]
}
Samstag, 23. Oktober 2010
$in IN (2,3,4)
$nin NOT IN
$all [2,3] ~ [1,2,3]
Samstag, 23. Oktober 2010
$mod yah, RLY
$size okay
$exists NOT NULL
$type huh?
Samstag, 23. Oktober 2010
@db['people'].find("address.city" => /haven/)
Samstag, 23. Oktober 2010
@db['people'].find("address.city" => /haven/)
Samstag, 23. Oktober 2010
Sorting
Samstag, 23. Oktober 2010
@db['people'].find().sort("address.street")
Samstag, 23. Oktober 2010
@db['people'].find().sort("address.street")
Samstag, 23. Oktober 2010
Pagination
Samstag, 23. Oktober 2010
@db['numbers'].find.sort("i").limit(10)
Samstag, 23. Oktober 2010
@db['numbers'].find.sort("i").limit(10).skip(50)
Samstag, 23. Oktober 2010
Counting
Samstag, 23. Oktober 2010
@db['numbers'].find.count
Samstag, 23. Oktober 2010
Distinct
Samstag, 23. Oktober 2010
@db['people'].distinct('tags').inspect
Samstag, 23. Oktober 2010
Group
Samstag, 23. Oktober 2010
Poor mans map/reduce
Samstag, 23. Oktober 2010
@db['people'].group(
['created_at'],
{},
{:tags => {}},
reduce,
finalize
)
Samstag, 23. Oktober 2010
@db['people'].group(
['created_at'],
{},
{:tags => {}},
reduce,
finalize
)
Samstag, 23. Oktober 2010
@db['people'].group(
['created_at'],
{},
{:tags => {}},
reduce,
finalize
)
Samstag, 23. Oktober 2010
@db['people'].group(
['created_at'],
{},
{:tags => {}},
reduce,
finalize
)
Samstag, 23. Oktober 2010
@db['people'].group(
['created_at'],
{},
{:tags => {}},
reduce,
finalize
)
Samstag, 23. Oktober 2010
function(doc, prev) {
for(i in doc.tags) {
if (doc.tags[i] in prev.tags) {
prev.tags[doc.tags[i]]++
} else {
prev.tags[doc.tags[i]] =1
}
}
}
Samstag, 23. Oktober 2010
{"created_at"=>2010-09-19 22:00:00 UTC, "tags"=>{"foo"=>11.0, "dumb"=>12.0, "stupid"=>7.0, "bar"=>7.0, "cool"=>14.0, "weird"=>17.0}}
{"created_at"=>2010-09-20 22:00:00 UTC, "tags"=>{"dumb"=>11.0, "stupid"=>5.0, "foo"=>10.0, "cool"=>8.0, "weird"=>9.0, "bar"=>15.0}}
{"created_at"=>2010-09-22 22:00:00 UTC, "tags"=>{"weird"=>15.0, "bar"=>9.0, "stupid"=>17.0, "cool"=>11.0, "dumb"=>10.0, "foo"=>12.0}}
{"created_at"=>2010-09-15 22:00:00 UTC, "tags"=>{"foo"=>11.0, "weird"=>7.0, "stupid"=>10.0, "cool"=>11.0, "bar"=>5.0, "dumb"=>8.0}}
{"created_at"=>2010-09-25 22:00:00 UTC, "tags"=>{"dumb"=>11.0, "weird"=>14.0, "cool"=>8.0, "foo"=>21.0, "bar"=>11.0, "stupid"=>13.0}}
{"created_at"=>2010-09-28 22:00:00 UTC, "tags"=>{"cool"=>11.0, "dumb"=>16.0, "stupid"=>11.0, "weird"=>15.0, "foo"=>9.0, "bar"=>16.0}}
{"created_at"=>2010-09-10 22:00:00 UTC, "tags"=>{"dumb"=>15.0, "weird"=>9.0, "bar"=>8.0, "cool"=>14.0, "stupid"=>11.0, "foo"=>11.0}}
{"created_at"=>2010-09-03 22:00:00 UTC, "tags"=>{"weird"=>14.0, "dumb"=>15.0, "stupid"=>11.0, "foo"=>16.0, "bar"=>20.0, "cool"=>10.0}}
{"created_at"=>2010-09-21 22:00:00 UTC, "tags"=>{"weird"=>15.0, "cool"=>14.0, "foo"=>13.0, "stupid"=>6.0, "bar"=>11.0, "dumb"=>9.0}}
{"created_at"=>2010-09-23 22:00:00 UTC, "tags"=>{"weird"=>15.0, "stupid"=>15.0, "dumb"=>15.0, "foo"=>16.0, "cool"=>10.0, "bar"=>11.0}}
{"created_at"=>2010-09-29 22:00:00 UTC, "tags"=>{"bar"=>9.0, "cool"=>14.0, "weird"=>16.0, "foo"=>8.0, "dumb"=>9.0, "stupid"=>12.0}}
{"created_at"=>2010-09-27 22:00:00 UTC, "tags"=>{"cool"=>13.0, "dumb"=>10.0, "stupid"=>12.0, "bar"=>8.0, "foo"=>16.0, "weird"=>13.0}}
{"created_at"=>2010-09-04 22:00:00 UTC, "tags"=>{"cool"=>11.0, "bar"=>9.0, "stupid"=>6.0, "weird"=>11.0, "dumb"=>8.0, "foo"=>11.0}}
{"created_at"=>2010-09-08 22:00:00 UTC, "tags"=>{"stupid"=>12.0, "dumb"=>11.0, "cool"=>15.0, "foo"=>11.0, "bar"=>9.0, "weird"=>8.0}}
{"created_at"=>2010-10-02 22:00:00 UTC, "tags"=>{"bar"=>8.0, "dumb"=>8.0, "cool"=>10.0, "foo"=>10.0, "stupid"=>8.0, "weird"=>6.0}}
{"created_at"=>2010-09-24 22:00:00 UTC, "tags"=>{"foo"=>13.0, "bar"=>12.0, "stupid"=>15.0, "weird"=>17.0, "dumb"=>7.0, "cool"=>10.0}}
{"created_at"=>2010-09-30 22:00:00 UTC, "tags"=>{"bar"=>10.0, "cool"=>6.0, "stupid"=>14.0, "weird"=>9.0, "dumb"=>12.0, "foo"=>19.0}}
{"created_at"=>2010-09-05 22:00:00 UTC, "tags"=>{"dumb"=>12.0, "foo"=>19.0, "weird"=>8.0, "stupid"=>8.0, "bar"=>7.0, "cool"=>10.0}}
{"created_at"=>2010-09-17 22:00:00 UTC, "tags"=>{"weird"=>13.0, "bar"=>14.0, "dumb"=>12.0, "foo"=>12.0, "stupid"=>10.0, "cool"=>9.0}}
{"created_at"=>2010-09-18 22:00:00 UTC, "tags"=>{"dumb"=>8.0, "cool"=>11.0, "foo"=>6.0, "bar"=>12.0, "weird"=>7.0, "stupid"=>6.0}}
{"created_at"=>2010-09-09 22:00:00 UTC, "tags"=>{"weird"=>11.0, "dumb"=>9.0, "foo"=>6.0, "bar"=>11.0, "cool"=>11.0, "stupid"=>6.0}}
{"created_at"=>2010-09-13 22:00:00 UTC, "tags"=>{"dumb"=>19.0, "stupid"=>9.0, "weird"=>12.0, "cool"=>11.0, "bar"=>10.0, "foo"=>15.0}}
{"created_at"=>2010-09-16 22:00:00 UTC, "tags"=>{"bar"=>6.0, "weird"=>8.0, "dumb"=>9.0, "cool"=>11.0, "stupid"=>17.0, "foo"=>15.0}}
{"created_at"=>2010-09-11 22:00:00 UTC, "tags"=>{"foo"=>10.0, "weird"=>9.0, "bar"=>8.0, "cool"=>4.0, "dumb"=>8.0, "stupid"=>9.0}}
{"created_at"=>2010-09-26 22:00:00 UTC, "tags"=>{"dumb"=>15.0, "weird"=>6.0, "stupid"=>15.0, "bar"=>10.0, "foo"=>13.0, "cool"=>15.0}}
{"created_at"=>2010-10-01 22:00:00 UTC, "tags"=>{"cool"=>7.0, "weird"=>11.0, "stupid"=>11.0, "bar"=>14.0, "foo"=>12.0, "dumb"=>11.0}}
{"created_at"=>2010-09-12 22:00:00 UTC, "tags"=>{"bar"=>7.0, "weird"=>12.0, "stupid"=>11.0, "cool"=>10.0, "foo"=>11.0, "dumb"=>9.0}}
{"created_at"=>2010-09-14 22:00:00 UTC, "tags"=>{"dumb"=>8.0, "foo"=>15.0, "cool"=>15.0, "stupid"=>15.0, "bar"=>7.0, "weird"=>14.0}}
{"created_at"=>2010-09-07 22:00:00 UTC, "tags"=>{"dumb"=>10.0, "cool"=>7.0, "foo"=>14.0, "weird"=>15.0, "bar"=>11.0, "stupid"=>7.0}}
{"created_at"=>2010-09-06 22:00:00 UTC, "tags"=>{"dumb"=>7.0, "bar"=>11.0, "cool"=>16.0, "weird"=>14.0, "foo"=>12.0, "stupid"=>6.0}}
Samstag, 23. Oktober 2010
{"created_at"=>2010-09-19 22:00:00 UTC, "tags"=>{"foo"=>11.0, "dumb"=>12.0, "stupid"=>7.0, "bar"=>7.0, "cool"=>14.0, "weird"=>17.0}}
{"created_at"=>2010-09-20 22:00:00 UTC, "tags"=>{"dumb"=>11.0, "stupid"=>5.0, "foo"=>10.0, "cool"=>8.0, "weird"=>9.0, "bar"=>15.0}}
{"created_at"=>2010-09-22 22:00:00 UTC, "tags"=>{"weird"=>15.0, "bar"=>9.0, "stupid"=>17.0, "cool"=>11.0, "dumb"=>10.0, "foo"=>12.0}}
{"created_at"=>2010-09-15 22:00:00 UTC, "tags"=>{"foo"=>11.0, "weird"=>7.0, "stupid"=>10.0, "cool"=>11.0, "bar"=>5.0, "dumb"=>8.0}}
{"created_at"=>2010-09-25 22:00:00 UTC, "tags"=>{"dumb"=>11.0, "weird"=>14.0, "cool"=>8.0, "foo"=>21.0, "bar"=>11.0, "stupid"=>13.0}}
{"created_at"=>2010-09-28 22:00:00 UTC, "tags"=>{"cool"=>11.0, "dumb"=>16.0, "stupid"=>11.0, "weird"=>15.0, "foo"=>9.0, "bar"=>16.0}}
{"created_at"=>2010-09-10 22:00:00 UTC, "tags"=>{"dumb"=>15.0, "weird"=>9.0, "bar"=>8.0, "cool"=>14.0, "stupid"=>11.0, "foo"=>11.0}}
{"created_at"=>2010-09-03 22:00:00 UTC, "tags"=>{"weird"=>14.0, "dumb"=>15.0, "stupid"=>11.0, "foo"=>16.0, "bar"=>20.0, "cool"=>10.0}}
{"created_at"=>2010-09-21 22:00:00 UTC, "tags"=>{"weird"=>15.0, "cool"=>14.0, "foo"=>13.0, "stupid"=>6.0, "bar"=>11.0, "dumb"=>9.0}}
{"created_at"=>2010-09-23 22:00:00 UTC, "tags"=>{"weird"=>15.0, "stupid"=>15.0, "dumb"=>15.0, "foo"=>16.0, "cool"=>10.0, "bar"=>11.0}}
{"created_at"=>2010-09-29 22:00:00 UTC, "tags"=>{"bar"=>9.0, "cool"=>14.0, "weird"=>16.0, "foo"=>8.0, "dumb"=>9.0, "stupid"=>12.0}}
{"created_at"=>2010-09-27 22:00:00 UTC, "tags"=>{"cool"=>13.0, "dumb"=>10.0, "stupid"=>12.0, "bar"=>8.0, "foo"=>16.0, "weird"=>13.0}}
{"created_at"=>2010-09-04 22:00:00 UTC, "tags"=>{"cool"=>11.0, "bar"=>9.0, "stupid"=>6.0, "weird"=>11.0, "dumb"=>8.0, "foo"=>11.0}}
{"created_at"=>2010-09-08 22:00:00 UTC, "tags"=>{"stupid"=>12.0, "dumb"=>11.0, "cool"=>15.0, "foo"=>11.0, "bar"=>9.0, "weird"=>8.0}}
{"created_at"=>2010-10-02 22:00:00 UTC, "tags"=>{"bar"=>8.0, "dumb"=>8.0, "cool"=>10.0, "foo"=>10.0, "stupid"=>8.0, "weird"=>6.0}}
{"created_at"=>2010-09-24 22:00:00 UTC, "tags"=>{"foo"=>13.0, "bar"=>12.0, "stupid"=>15.0, "weird"=>17.0, "dumb"=>7.0, "cool"=>10.0}}
{"created_at"=>2010-09-30 22:00:00 UTC, "tags"=>{"bar"=>10.0, "cool"=>6.0, "stupid"=>14.0, "weird"=>9.0, "dumb"=>12.0, "foo"=>19.0}}
{"created_at"=>2010-09-05 22:00:00 UTC, "tags"=>{"dumb"=>12.0, "foo"=>19.0, "weird"=>8.0, "stupid"=>8.0, "bar"=>7.0, "cool"=>10.0}}
{"created_at"=>2010-09-17 22:00:00 UTC, "tags"=>{"weird"=>13.0, "bar"=>14.0, "dumb"=>12.0, "foo"=>12.0, "stupid"=>10.0, "cool"=>9.0}}
{"created_at"=>2010-09-18 22:00:00 UTC, "tags"=>{"dumb"=>8.0, "cool"=>11.0, "foo"=>6.0, "bar"=>12.0, "weird"=>7.0, "stupid"=>6.0}}
{"created_at"=>2010-09-09 22:00:00 UTC, "tags"=>{"weird"=>11.0, "dumb"=>9.0, "foo"=>6.0, "bar"=>11.0, "cool"=>11.0, "stupid"=>6.0}}
{"created_at"=>2010-09-13 22:00:00 UTC, "tags"=>{"dumb"=>19.0, "stupid"=>9.0, "weird"=>12.0, "cool"=>11.0, "bar"=>10.0, "foo"=>15.0}}
{"created_at"=>2010-09-16 22:00:00 UTC, "tags"=>{"bar"=>6.0, "weird"=>8.0, "dumb"=>9.0, "cool"=>11.0, "stupid"=>17.0, "foo"=>15.0}}
{"created_at"=>2010-09-11 22:00:00 UTC, "tags"=>{"foo"=>10.0, "weird"=>9.0, "bar"=>8.0, "cool"=>4.0, "dumb"=>8.0, "stupid"=>9.0}}
{"created_at"=>2010-09-26 22:00:00 UTC, "tags"=>{"dumb"=>15.0, "weird"=>6.0, "stupid"=>15.0, "bar"=>10.0, "foo"=>13.0, "cool"=>15.0}}
{"created_at"=>2010-10-01 22:00:00 UTC, "tags"=>{"cool"=>7.0, "weird"=>11.0, "stupid"=>11.0, "bar"=>14.0, "foo"=>12.0, "dumb"=>11.0}}
{"created_at"=>2010-09-12 22:00:00 UTC, "tags"=>{"bar"=>7.0, "weird"=>12.0, "stupid"=>11.0, "cool"=>10.0, "foo"=>11.0, "dumb"=>9.0}}
{"created_at"=>2010-09-14 22:00:00 UTC, "tags"=>{"dumb"=>8.0, "foo"=>15.0, "cool"=>15.0, "stupid"=>15.0, "bar"=>7.0, "weird"=>14.0}}
{"created_at"=>2010-09-07 22:00:00 UTC, "tags"=>{"dumb"=>10.0, "cool"=>7.0, "foo"=>14.0, "weird"=>15.0, "bar"=>11.0, "stupid"=>7.0}}
{"created_at"=>2010-09-06 22:00:00 UTC, "tags"=>{"dumb"=>7.0, "bar"=>11.0, "cool"=>16.0, "weird"=>14.0, "foo"=>12.0, "stupid"=>6.0}}
"tags" => {
"foo" => 11.0,
"dumb" => 12.0,
"stupid" => 7.0,
"bar" => 7.0,
"cool" => 14.0,
"weird" => 17.0
}
Samstag, 23. Oktober 2010
function(prev) {
var mostPopular = 0;
for(i in prev.tags) {
if(prev.tags[i] > mostPopular) {
prev.tag = i;
prev.count = prev.tags[i];
mostPopular = prev.tags[i];
}
}
delete prev.tags
}
Samstag, 23. Oktober 2010
{"created_at"=>2010-09-27 22:00:00 UTC, "tag"=>"stupid", "count"=>18.0}
{"created_at"=>2010-09-29 22:00:00 UTC, "tag"=>"stupid", "count"=>20.0}
{"created_at"=>2010-09-12 22:00:00 UTC, "tag"=>"cool", "count"=>11.0}
{"created_at"=>2010-09-04 22:00:00 UTC, "tag"=>"stupid", "count"=>12.0}
{"created_at"=>2010-09-21 22:00:00 UTC, "tag"=>"stupid", "count"=>16.0}
{"created_at"=>2010-09-03 22:00:00 UTC, "tag"=>"foo", "count"=>15.0}
{"created_at"=>2010-09-26 22:00:00 UTC, "tag"=>"foo", "count"=>17.0}
{"created_at"=>2010-09-18 22:00:00 UTC, "tag"=>"foo", "count"=>17.0}
{"created_at"=>2010-09-24 22:00:00 UTC, "tag"=>"cool", "count"=>11.0}
Samstag, 23. Oktober 2010
Map / Reduce
Samstag, 23. Oktober 2010
map = <<-END
function() {
this.tags.forEach(function(z) {
emit(z, {count: 1});
});
}
END
reduce = <<-END
function(key, values) {
var total = 0;
values.forEach(function(v) { total += v.count });
return {count: total}
}
END
collection = @db['people'].map_reduce(
map, reduce
)
Samstag, 23. Oktober 2010
Indexes
Samstag, 23. Oktober 2010
db['people'].create_index("tags")
@db['people'].create_index(
[["tags", Mongo::ASCENDING]]
)
db['people'].drop_index("tags_1")
db['people'].drop_indexes
db['people'].index_information
Samstag, 23. Oktober 2010
Geospatial stuff
Samstag, 23. Oktober 2010
@db['people'].create_index(
[["latlng", Mongo::GEO2D]]
)
Samstag, 23. Oktober 2010
@db['people'].find(
"latlng" => {"$near" => [53.593978, 10.107380]}
)
Samstag, 23. Oktober 2010
GridFS usage
Samstag, 23. Oktober 2010
grid = Mongo::Grid.new(@db)
id = grid.put("You can put Strings in here",
:filename => 'test.txt')
file = grid.get(id)
file.filename
file.read
grid.delete(id)
grid.put(
File.open("/Users/jankrutisch/Dropbox/Photos/IMGP8989.jpg")
)
Samstag, 23. Oktober 2010
fs = Mongo::GridFileSystem.new(db)
fs.open("test.txt", "w") do |f|
f.write "You can put stuff in here"
end
fs.open("test.txt", "r") do |f|
puts f.read
end
fs.delete("test.txt")
Samstag, 23. Oktober 2010
Capped collections
Samstag, 23. Oktober 2010
@db.create_collection('capped_numbers',
:capped => true,
:max => 50
)
@db.create_collection('capped_numbers',
:capped => true,
:size => 1024 * 64
)
Samstag, 23. Oktober 2010
explain
Samstag, 23. Oktober 2010
@db['people'].find(
"address.city" => /haven/
).explain
Samstag, 23. Oktober 2010
@db['people'].find(
"address.city" => /haven/
).explain
Samstag, 23. Oktober 2010
{
"cursor"=>"BasicCursor",
"nscanned"=>1000,
"nscannedObjects"=>1000,
"n"=>39, "millis"=>2,
"indexBounds"=>{},
"allPlans"=>[
{"cursor"=>"BasicCursor", "indexBounds"=>{}}
]
}
Samstag, 23. Oktober 2010
{
"cursor"=>"BtreeCursor address.city_1 multi",
"nscanned"=>1000,
"nscannedObjects"=>39,
"n"=>39, "millis"=>1,
"indexBounds"=>{
"address.city"=>[["", {}], [/haven/, /haven/]]
},
"allPlans"=>[
{
"cursor"=>"BtreeCursor address.city_1 multi",
"indexBounds"=>{
"address.city"=>[["", {}], [/haven/, /haven/]]
}
}
]
}
Samstag, 23. Oktober 2010
ODMs
Samstag, 23. Oktober 2010
mongo_mapper
Samstag, 23. Oktober 2010
John Nunemaker
@jnunemaker
Samstag, 23. Oktober 2010
is in production
Samstag, 23. Oktober 2010
documentation?
Samstag, 23. Oktober 2010
Samstag, 23. Oktober 2010
how to
Samstag, 23. Oktober 2010
rails initializer
Samstag, 23. Oktober 2010
# config/initializers/mongo_mapper.rb
File.open(File.join(Rails.root, 'config/mongodb.yml'), 'r') do |f|
@settings = YAML.load(f)[Rails.env]
end
MongoMapper.connection = Mongo::Connection.from_uri(@settings["connection"]) if @settings["connection"]
MongoMapper.database = @settings["database"]
Samstag, 23. Oktober 2010
a simple example
Samstag, 23. Oktober 2010
MongoMapper.connection = @connection
MongoMapper.database = "test"
class Quote
include MongoMapper::Document
key :from
key :text
key :views, Integer
timestamps!
end
Samstag, 23. Oktober 2010
finders
Samstag, 23. Oktober 2010
Quote.where(:from => 'Yogi Berra').all
Quote.where(:from => 'Yogi Berra').limit(5).sort(:from.desc).all
Samstag, 23. Oktober 2010
embedded docs
Samstag, 23. Oktober 2010
Samstag, 23. Oktober 2010
class Person
include MongoMapper::Document
key :name
one :address
key :tags, Array
end
class Address
include MongoMapper::Document
key :street
key :city
key :country
key :zip
end
Samstag, 23. Oktober 2010
person = Person.first
address = Person.first.address
Samstag, 23. Oktober 2010
scopes
Samstag, 23. Oktober 2010
class Person
scope :tagged, lambda { |tag| where(:tags.in => [tag]) }
end
puts Person.tagged('cool').first.inspect
Samstag, 23. Oktober 2010
new website coming soon
Samstag, 23. Oktober 2010
mongoid
Samstag, 23. Oktober 2010
Durran Jordan
(of Hashrocket)
Samstag, 23. Oktober 2010
Two major versions
Samstag, 23. Oktober 2010
1.x (1.9.x) targeting
Rails 2.3.x
Samstag, 23. Oktober 2010
2.x (2.0beta) targeting
Rails 3.0
Samstag, 23. Oktober 2010
Good documentation
Samstag, 23. Oktober 2010
Samstag, 23. Oktober 2010
rails initializer
Samstag, 23. Oktober 2010
File.open(File.join(RAILS_ROOT, 'config/mongodb.yml'), 'r') do |f|
@settings = YAML.load(f)[RAILS_ENV]
end
Mongoid::Config.instance.from_hash(@settings)
Samstag, 23. Oktober 2010
a simple example
Samstag, 23. Oktober 2010
class Quote
include Mongoid::Document
include Mongoid::Timestamps
field :from
field :text
field :views, :type => Integer
end
Samstag, 23. Oktober 2010
finders
Samstag, 23. Oktober 2010
Quote.where(:from => 'Yogi Berra').all
Quote.where(:from => 'Yogi Berra').limit(5).order_by(:from.desc).all
Samstag, 23. Oktober 2010
embedded docs
Samstag, 23. Oktober 2010
class Person
include Mongoid::Document
field :name
embeds_one :address
field :tags, :type => Array
end
class Address
include Mongoid::Document
field :street
field :city
field :country
field :zip
end
Samstag, 23. Oktober 2010
person = Person.first
address = Person.first.address
Samstag, 23. Oktober 2010
scopes
Samstag, 23. Oktober 2010
class Person
scope :tagged, lambda { |tag| where(:tags.in => [tag]) }
end
puts Person.tagged('cool').first.inspect
Samstag, 23. Oktober 2010
More features
Samstag, 23. Oktober 2010
atomic updates
Samstag, 23. Oktober 2010
mongoid tries to be
clever
Samstag, 23. Oktober 2010
(using the „dirty“ flags)
Samstag, 23. Oktober 2010
(it‘s probably better to
bypass the ODM
sometimes)
Samstag, 23. Oktober 2010
GridFS
Samstag, 23. Oktober 2010
external libraries for
both
Samstag, 23. Oktober 2010
mongo_mapper > grip
Samstag, 23. Oktober 2010
mongoid > mongoid_grid
Samstag, 23. Oktober 2010
Other noteworthy
libraries
Samstag, 23. Oktober 2010
Other not so noteworthy
libraries
Samstag, 23. Oktober 2010
I ♥
Samstag, 23. Oktober 2010
thanks for listening.
‣ jan@krutisch.de
‣ http://jan.krutisch.de/
‣ http://github.com/halfbyte/
‣ http://twitter.com/halfbyte
‣ http://www.mindmatters.de/
‣ http://www.mongodb.org/
‣ http://www.mongoid.org/
‣ http://github.com/jnunemaker/mongo_mapper
‣ http://github.com/halfbyte/mongo_ruby_examples
Samstag, 23. Oktober 2010

Mais conteúdo relacionado

Mais procurados

Ruby on CouchDB - SimplyStored and RockingChair
Ruby on CouchDB - SimplyStored and RockingChairRuby on CouchDB - SimplyStored and RockingChair
Ruby on CouchDB - SimplyStored and RockingChairJonathan Weiss
 
MongoDB for Perl Developers
MongoDB for Perl DevelopersMongoDB for Perl Developers
MongoDB for Perl DevelopersYnon Perek
 
The Ring programming language version 1.5.1 book - Part 44 of 180
The Ring programming language version 1.5.1 book - Part 44 of 180The Ring programming language version 1.5.1 book - Part 44 of 180
The Ring programming language version 1.5.1 book - Part 44 of 180Mahmoud Samir Fayed
 
Basic crud operation
Basic crud operationBasic crud operation
Basic crud operationzarigatongy
 
Mythbusting: Understanding How We Measure the Performance of MongoDB
Mythbusting: Understanding How We Measure the Performance of MongoDBMythbusting: Understanding How We Measure the Performance of MongoDB
Mythbusting: Understanding How We Measure the Performance of MongoDBMongoDB
 
MySQL flexible schema and JSON for Internet of Things
MySQL flexible schema and JSON for Internet of ThingsMySQL flexible schema and JSON for Internet of Things
MySQL flexible schema and JSON for Internet of ThingsAlexander Rubin
 
Optimizing Slow Queries with Indexes and Creativity
Optimizing Slow Queries with Indexes and CreativityOptimizing Slow Queries with Indexes and Creativity
Optimizing Slow Queries with Indexes and CreativityMongoDB
 
MongoDB Europe 2016 - Enabling the Internet of Things at Proximus - Belgium's...
MongoDB Europe 2016 - Enabling the Internet of Things at Proximus - Belgium's...MongoDB Europe 2016 - Enabling the Internet of Things at Proximus - Belgium's...
MongoDB Europe 2016 - Enabling the Internet of Things at Proximus - Belgium's...MongoDB
 
MongoDBで作るソーシャルデータ新解析基盤
MongoDBで作るソーシャルデータ新解析基盤MongoDBで作るソーシャルデータ新解析基盤
MongoDBで作るソーシャルデータ新解析基盤Takahiro Inoue
 
20110514 mongo dbチューニング
20110514 mongo dbチューニング20110514 mongo dbチューニング
20110514 mongo dbチューニングYuichi Matsuo
 
(gentle (introduction Clojure))
(gentle (introduction Clojure))(gentle (introduction Clojure))
(gentle (introduction Clojure))Guy Taylor
 
Inside MongoDB: the Internals of an Open-Source Database
Inside MongoDB: the Internals of an Open-Source DatabaseInside MongoDB: the Internals of an Open-Source Database
Inside MongoDB: the Internals of an Open-Source DatabaseMike Dirolf
 
Building DSLs with Groovy
Building DSLs with GroovyBuilding DSLs with Groovy
Building DSLs with GroovySten Anderson
 
MongoDB全機能解説2
MongoDB全機能解説2MongoDB全機能解説2
MongoDB全機能解説2Takahiro Inoue
 
Back to basics Italian webinar 2 Mia prima applicazione MongoDB
Back to basics Italian webinar 2  Mia prima applicazione MongoDBBack to basics Italian webinar 2  Mia prima applicazione MongoDB
Back to basics Italian webinar 2 Mia prima applicazione MongoDBMongoDB
 
MongoDB Indexing Constraints and Creative Schemas
MongoDB Indexing Constraints and Creative SchemasMongoDB Indexing Constraints and Creative Schemas
MongoDB Indexing Constraints and Creative SchemasMongoDB
 
MongoDB Performance Tuning
MongoDB Performance TuningMongoDB Performance Tuning
MongoDB Performance TuningPuneet Behl
 
Better Web Clients with Mantle and AFNetworking
Better Web Clients with Mantle and AFNetworkingBetter Web Clients with Mantle and AFNetworking
Better Web Clients with Mantle and AFNetworkingGuillermo Gonzalez
 

Mais procurados (20)

Ruby on CouchDB - SimplyStored and RockingChair
Ruby on CouchDB - SimplyStored and RockingChairRuby on CouchDB - SimplyStored and RockingChair
Ruby on CouchDB - SimplyStored and RockingChair
 
MongoDB for Perl Developers
MongoDB for Perl DevelopersMongoDB for Perl Developers
MongoDB for Perl Developers
 
The Ring programming language version 1.5.1 book - Part 44 of 180
The Ring programming language version 1.5.1 book - Part 44 of 180The Ring programming language version 1.5.1 book - Part 44 of 180
The Ring programming language version 1.5.1 book - Part 44 of 180
 
Basic crud operation
Basic crud operationBasic crud operation
Basic crud operation
 
Mythbusting: Understanding How We Measure the Performance of MongoDB
Mythbusting: Understanding How We Measure the Performance of MongoDBMythbusting: Understanding How We Measure the Performance of MongoDB
Mythbusting: Understanding How We Measure the Performance of MongoDB
 
MySQL flexible schema and JSON for Internet of Things
MySQL flexible schema and JSON for Internet of ThingsMySQL flexible schema and JSON for Internet of Things
MySQL flexible schema and JSON for Internet of Things
 
Optimizing Slow Queries with Indexes and Creativity
Optimizing Slow Queries with Indexes and CreativityOptimizing Slow Queries with Indexes and Creativity
Optimizing Slow Queries with Indexes and Creativity
 
MongoDB Europe 2016 - Enabling the Internet of Things at Proximus - Belgium's...
MongoDB Europe 2016 - Enabling the Internet of Things at Proximus - Belgium's...MongoDB Europe 2016 - Enabling the Internet of Things at Proximus - Belgium's...
MongoDB Europe 2016 - Enabling the Internet of Things at Proximus - Belgium's...
 
MongoDBで作るソーシャルデータ新解析基盤
MongoDBで作るソーシャルデータ新解析基盤MongoDBで作るソーシャルデータ新解析基盤
MongoDBで作るソーシャルデータ新解析基盤
 
Mongo db for C# Developers
Mongo db for C# DevelopersMongo db for C# Developers
Mongo db for C# Developers
 
20110514 mongo dbチューニング
20110514 mongo dbチューニング20110514 mongo dbチューニング
20110514 mongo dbチューニング
 
(gentle (introduction Clojure))
(gentle (introduction Clojure))(gentle (introduction Clojure))
(gentle (introduction Clojure))
 
Inside MongoDB: the Internals of an Open-Source Database
Inside MongoDB: the Internals of an Open-Source DatabaseInside MongoDB: the Internals of an Open-Source Database
Inside MongoDB: the Internals of an Open-Source Database
 
Building DSLs with Groovy
Building DSLs with GroovyBuilding DSLs with Groovy
Building DSLs with Groovy
 
MongoDB全機能解説2
MongoDB全機能解説2MongoDB全機能解説2
MongoDB全機能解説2
 
Back to basics Italian webinar 2 Mia prima applicazione MongoDB
Back to basics Italian webinar 2  Mia prima applicazione MongoDBBack to basics Italian webinar 2  Mia prima applicazione MongoDB
Back to basics Italian webinar 2 Mia prima applicazione MongoDB
 
MongoDB Indexing Constraints and Creative Schemas
MongoDB Indexing Constraints and Creative SchemasMongoDB Indexing Constraints and Creative Schemas
MongoDB Indexing Constraints and Creative Schemas
 
MongoDB
MongoDBMongoDB
MongoDB
 
MongoDB Performance Tuning
MongoDB Performance TuningMongoDB Performance Tuning
MongoDB Performance Tuning
 
Better Web Clients with Mantle and AFNetworking
Better Web Clients with Mantle and AFNetworkingBetter Web Clients with Mantle and AFNetworking
Better Web Clients with Mantle and AFNetworking
 

Semelhante a Mongodb railscamphh

MongoDB on Rails (and Ruby)
MongoDB on Rails (and Ruby)MongoDB on Rails (and Ruby)
MongoDB on Rails (and Ruby)jan_mindmatters
 
The Tech Side of Project Argo
The Tech Side of Project ArgoThe Tech Side of Project Argo
The Tech Side of Project ArgoWesley Lindamood
 
Opening up the Social Web - Standards that are bridging the Islands
Opening up the Social Web - Standards that are bridging the Islands Opening up the Social Web - Standards that are bridging the Islands
Opening up the Social Web - Standards that are bridging the Islands Bastian Hofmann
 
Designing With Type :: FontConf 2010
Designing With Type :: FontConf 2010Designing With Type :: FontConf 2010
Designing With Type :: FontConf 2010Kyle Meyer
 
D-Talk: What's awesome about Ruby 2.x and Rails 4
D-Talk: What's awesome about Ruby 2.x and Rails 4D-Talk: What's awesome about Ruby 2.x and Rails 4
D-Talk: What's awesome about Ruby 2.x and Rails 4Jan Berdajs
 
Multi dimensional profiling
Multi dimensional profilingMulti dimensional profiling
Multi dimensional profilingbergel
 
Developing in HTML5: Widgetbox & Sencha Touch
Developing in HTML5: Widgetbox & Sencha TouchDeveloping in HTML5: Widgetbox & Sencha Touch
Developing in HTML5: Widgetbox & Sencha TouchSencha
 
Cassandra devoxx 2010
Cassandra devoxx 2010Cassandra devoxx 2010
Cassandra devoxx 2010jbellis
 
Desenvolvendo Aplicativos Sociais com Rails 3
Desenvolvendo Aplicativos Sociais com Rails 3Desenvolvendo Aplicativos Sociais com Rails 3
Desenvolvendo Aplicativos Sociais com Rails 3Carlos Brando
 
Tree tricks osdc_melbourne_20101124
Tree tricks osdc_melbourne_20101124Tree tricks osdc_melbourne_20101124
Tree tricks osdc_melbourne_20101124David Fetter
 
Python avanzado - parte 1
Python avanzado - parte 1Python avanzado - parte 1
Python avanzado - parte 1coto
 
Document-Oriented Databases: Couchdb Primer
Document-Oriented Databases: Couchdb PrimerDocument-Oriented Databases: Couchdb Primer
Document-Oriented Databases: Couchdb Primerjsiarto
 

Semelhante a Mongodb railscamphh (17)

MongoDB on Rails (and Ruby)
MongoDB on Rails (and Ruby)MongoDB on Rails (and Ruby)
MongoDB on Rails (and Ruby)
 
Mongo db
Mongo dbMongo db
Mongo db
 
Ajax solr
Ajax solrAjax solr
Ajax solr
 
The Tech Side of Project Argo
The Tech Side of Project ArgoThe Tech Side of Project Argo
The Tech Side of Project Argo
 
Opening up the Social Web - Standards that are bridging the Islands
Opening up the Social Web - Standards that are bridging the Islands Opening up the Social Web - Standards that are bridging the Islands
Opening up the Social Web - Standards that are bridging the Islands
 
Designing With Type :: FontConf 2010
Designing With Type :: FontConf 2010Designing With Type :: FontConf 2010
Designing With Type :: FontConf 2010
 
Metaprogramming
MetaprogrammingMetaprogramming
Metaprogramming
 
D-Talk: What's awesome about Ruby 2.x and Rails 4
D-Talk: What's awesome about Ruby 2.x and Rails 4D-Talk: What's awesome about Ruby 2.x and Rails 4
D-Talk: What's awesome about Ruby 2.x and Rails 4
 
jQuery Way
jQuery WayjQuery Way
jQuery Way
 
Multi dimensional profiling
Multi dimensional profilingMulti dimensional profiling
Multi dimensional profiling
 
Developing in HTML5: Widgetbox & Sencha Touch
Developing in HTML5: Widgetbox & Sencha TouchDeveloping in HTML5: Widgetbox & Sencha Touch
Developing in HTML5: Widgetbox & Sencha Touch
 
Cassandra devoxx 2010
Cassandra devoxx 2010Cassandra devoxx 2010
Cassandra devoxx 2010
 
Chaco Step-by-Step
Chaco Step-by-StepChaco Step-by-Step
Chaco Step-by-Step
 
Desenvolvendo Aplicativos Sociais com Rails 3
Desenvolvendo Aplicativos Sociais com Rails 3Desenvolvendo Aplicativos Sociais com Rails 3
Desenvolvendo Aplicativos Sociais com Rails 3
 
Tree tricks osdc_melbourne_20101124
Tree tricks osdc_melbourne_20101124Tree tricks osdc_melbourne_20101124
Tree tricks osdc_melbourne_20101124
 
Python avanzado - parte 1
Python avanzado - parte 1Python avanzado - parte 1
Python avanzado - parte 1
 
Document-Oriented Databases: Couchdb Primer
Document-Oriented Databases: Couchdb PrimerDocument-Oriented Databases: Couchdb Primer
Document-Oriented Databases: Couchdb Primer
 

Mais de jan_mindmatters

Ruby for Artists and Tinkerers. A non-presentation.
Ruby for Artists and Tinkerers. A non-presentation.Ruby for Artists and Tinkerers. A non-presentation.
Ruby for Artists and Tinkerers. A non-presentation.jan_mindmatters
 
realtime audio on ze web @ hhjs
realtime audio on ze web @ hhjsrealtime audio on ze web @ hhjs
realtime audio on ze web @ hhjsjan_mindmatters
 
Railsrumble railscamphh 2010
Railsrumble railscamphh 2010Railsrumble railscamphh 2010
Railsrumble railscamphh 2010jan_mindmatters
 
10 fun projects to improve your coding skills
10 fun projects to improve your coding skills10 fun projects to improve your coding skills
10 fun projects to improve your coding skillsjan_mindmatters
 
Open Source Hardware - Of makers and tinkerers
Open Source Hardware - Of makers and tinkerersOpen Source Hardware - Of makers and tinkerers
Open Source Hardware - Of makers and tinkerersjan_mindmatters
 
Liebe Dein Frontend wie Dich selbst! HAML & SASS & COMPASS & less
Liebe Dein Frontend wie Dich selbst! HAML & SASS & COMPASS & lessLiebe Dein Frontend wie Dich selbst! HAML & SASS & COMPASS & less
Liebe Dein Frontend wie Dich selbst! HAML & SASS & COMPASS & lessjan_mindmatters
 
Facebook mit Rails und Facebooker
Facebook mit Rails und FacebookerFacebook mit Rails und Facebooker
Facebook mit Rails und Facebookerjan_mindmatters
 
Show the frontend some love - HAML, SASS and COMPASS
Show the frontend some love - HAML, SASS and COMPASSShow the frontend some love - HAML, SASS and COMPASS
Show the frontend some love - HAML, SASS and COMPASSjan_mindmatters
 
Lehmanns Rails Erweitern
Lehmanns Rails ErweiternLehmanns Rails Erweitern
Lehmanns Rails Erweiternjan_mindmatters
 
Rails i18n - Railskonferenz 2007
Rails i18n - Railskonferenz 2007Rails i18n - Railskonferenz 2007
Rails i18n - Railskonferenz 2007jan_mindmatters
 

Mais de jan_mindmatters (12)

Ruby for Artists and Tinkerers. A non-presentation.
Ruby for Artists and Tinkerers. A non-presentation.Ruby for Artists and Tinkerers. A non-presentation.
Ruby for Artists and Tinkerers. A non-presentation.
 
realtime audio on ze web @ hhjs
realtime audio on ze web @ hhjsrealtime audio on ze web @ hhjs
realtime audio on ze web @ hhjs
 
Railsrumble railscamphh 2010
Railsrumble railscamphh 2010Railsrumble railscamphh 2010
Railsrumble railscamphh 2010
 
10 fun projects to improve your coding skills
10 fun projects to improve your coding skills10 fun projects to improve your coding skills
10 fun projects to improve your coding skills
 
Open Source Hardware - Of makers and tinkerers
Open Source Hardware - Of makers and tinkerersOpen Source Hardware - Of makers and tinkerers
Open Source Hardware - Of makers and tinkerers
 
Liebe Dein Frontend wie Dich selbst! HAML & SASS & COMPASS & less
Liebe Dein Frontend wie Dich selbst! HAML & SASS & COMPASS & lessLiebe Dein Frontend wie Dich selbst! HAML & SASS & COMPASS & less
Liebe Dein Frontend wie Dich selbst! HAML & SASS & COMPASS & less
 
Facebook mit Rails und Facebooker
Facebook mit Rails und FacebookerFacebook mit Rails und Facebooker
Facebook mit Rails und Facebooker
 
Show the frontend some love - HAML, SASS and COMPASS
Show the frontend some love - HAML, SASS and COMPASSShow the frontend some love - HAML, SASS and COMPASS
Show the frontend some love - HAML, SASS and COMPASS
 
HAML / SASS and COMPASS
HAML / SASS and COMPASSHAML / SASS and COMPASS
HAML / SASS and COMPASS
 
Merb. Rails in anders.
Merb. Rails in anders.Merb. Rails in anders.
Merb. Rails in anders.
 
Lehmanns Rails Erweitern
Lehmanns Rails ErweiternLehmanns Rails Erweitern
Lehmanns Rails Erweitern
 
Rails i18n - Railskonferenz 2007
Rails i18n - Railskonferenz 2007Rails i18n - Railskonferenz 2007
Rails i18n - Railskonferenz 2007
 

Último

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessPixlogix Infotech
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 

Último (20)

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 

Mongodb railscamphh