Inlägg taggade ‘MongoDB’

Frozen Rails

I fredags gick konferensen Frozen Rails av stapeln i Helsingfors och Athega var självklart representerade.

Rails at GitHub (Chris Wanstrath, @defunkt)

Konferensen inleddes av Chris Wanstrath som gick igenom hur Ruby on Rails används på GitHub. Vi fick även reda på hur de använder Git (grit, smoke, chimney) och hur de hanterar meddelandeköer (resque).

Några av projekten som nämndes:

  • albino för syntax highlighting genom (front för pygmentize)
  • faker för att generera påhittad data: namn, adresser, telefonnummer
  • Rack HTTP servern Unicorn

The Plataforma Way (José Valim, @josevalim)

Dagens andra föreläsning hölls av José Valim från Plataforma tecnologia. José pratade om autentiseringslösningen Devise (bygger på Warden), domänspråket simple_form (inspirerat av Formtastic) samt Responders vilket är en utbyggnad av respond_with i Rails 3. Lite rörig föreläsning men med många intressanta projekt, kommer speciellt hålla koll på Devise.

Jag har sedan jag bloggade om MongoDB första gången varit intresserad av projektet och nu fick vi verkligen en bra genomgång av 10gen’s Michael Dirolf.

Översikt av MongoDB:

  • Atomiska operationer per dokument (:$push)
  • Dynamiska frågor
  • Hög prestanda (10% långsammare än memcached, snabbare än CouchDB)
  • Master/Slave failover
  • Auto-sharding (snart)
  • Servern har en JavaScript parser

Mobile Web Apps with Rails 3 (Yehuda Katz, @wycats)

Yehuda Katz på Frozen Rails

Även om jag sett föreläsningen tidigare (Efter Philly ETE, Emerging Technologies for the Enterprise) så var det bra att få se den live så att säga.

Några av punkterna som Yehuda berörde:

  • HTML 5 LocalStorage (samt Offline API)
  • Föredra gammal data
  • HTML == static asset
  • Betrakta webbläsaren som en API-klient
  • “Sip, don’t gulp”

Projekt:

Cucumbered (Joseph Wilk, @josephwilk)

Frozen Rails Cucumbered
(Foto: Chris Comella)

Den bästa föreläsningen på hela konferensen stod Joseph Wilk för, ämnet var Cucumber och mer specifikt hur man ser till att testerna går så fort som möjligt. (Cucumber 0.7 är för övrigt så galet snabb att det inte ens är roligt nu när de bytt från TreeTop till Ragel)

Några av Josephs punkter:

  • Cukover vs. Autotest
  • Harmony (Frontar Trace/SpiderMonkey i Ruby)
  • cucumber –format

CouchDB on Rails (Jonathan Weiss, @jweiss)

Jonathan hade ett digert uppdrag framför sig då konferensdeltagarna direkt jämförde allt med hur det fungerar i MongoDB. Tyvärr var exemplen lite för enkla och visade inte riktigt på styrkan i CouchDB, snarare att det är “svårare” att ställa enkla frågor än med SQL då man måste implementera map/reduce i JavaScript själv. (Vilket är en BRA grej när man gör lite mer avancerade saker)

Några av punkterna:

  • “Built for the web”
  • Skalar bra
  • Inga konstigheter: HTTP, JavaScript, JSON
  • Revisioner (id + rev)
  • Inga collections (på gott och ont)
  • “JavaScript, easier than SQL”
  • Värdet kan vara komplex JSON
  • Nycklarna kan vara arrayer
  • Statiska frågor (map/reduce)
  • Compaction of B-tree via HTTP request (tänker inte ens försöka översätta :)
  • HTTP cache (Varnish) och lastbalansering (HAProxy, nginx)
  • Inbäddad Lucene (Killer feature?)

Rails 3: Tasty Burgers (Carl Lerche, @carllerche)

  • Bundler (Isolation av gems)
  • Möjligt att använda jQuery i Rails!
  • Routern kan nu ha valfria segment, scopes och HTTP verb
  • Rack överallt!
  • rails_upgrade

Perfectionism (Jarkko Laine, @jarkko)

Priset för den nervösaste killen på hela konferensen måste ha gått till Jarkko. Förutom detta var det en grym sista föreläsning om hur vi perfektionister ofta har problem med att skeppa något innan det är helt perfekt. (vilket det kanske aldrig blir) Han rekomenderade även boken The Cluetrain Manifesto (hela bokens text)

Perfection, Minimally Viable Product, Markets are conversations, Ship!

Oh, hela konferensen filmades så när filmerna dyker upp på nätet så länkar jag dem här.

MongoDB

MongoDB - Scalability/Performance - Depth of Functionality

MongoDB är en blandning av nyckel-värde databas (t.ex. Scalaris), dokumentdatabas (t.ex. CouchDB) och relationsdatabas (t.ex. MySQL).

Den är skriven i C++ och passar bra för realtidsanalys av webbstatistik
(sidvisningar, unika besökare, osv), Sessionsobjekt, Datacachning och mycket mer.

Den har inbyggd replikering, automatisk failover och sharding, hög prestanda och den är open source.

Internt så sparas datan i formatet BSON, vilket är JSON med ett datumformat och möjlighet att spara binärdata.

Installation

Jag kommer som vanligt att använda Mac OS X och Ruby men det finns förkompilerade paket för de vanligaste operativsystemen:

  • OS X 32 bit
  • OS X 64 bit
  • Linux 32 bit
  • Linux 64 bit
  • Windows 32 bit
  • Solaris i86pc (EXPERIMENTAL)

Det finns även bindningar till ett flertal olika språk, dock har jag inte sett någon för .NET

Installationen var helt smärtfri, bara att ladda ner senaste tarbollen (mongodb-osx-x86_64-0.9.5) och packa upp den på valfri plats.

Man behöver skapa en datakatalog (standard är /data/db) och sen starta servern med

./mongod --dbpath [DATAKATALOGEN]

Nu lyssnar databasen på port 27017 och det finns ett webbgränssnitt på port 28017.

På Rubysidan behövde jag bara installera paketet mongodb-mongo från GitHub med RubyGems:

sudo gem install mongodb-mongo

Dags för lite kod

Att ansluta till databasen:

#!/usr/bin/env ruby
 
require 'rubygems'
require 'mongo'
 
db = XGen::Mongo::Driver::Mongo.new.db("mydb")

MongoDB har konceptet collections för likartade dokument. (Eller olikartade.. det bestämmer du helt själv) Man kan likna dem vid tabeller.

# Hämtar en collection, den skapas om den inte redan finns
coll = db.collection("testCollection")
 
# Man kan stoppa in olika sorters dokument
coll.insert({ :name => "Peter", :address => { :city => "Stockholm" } })
coll.insert({ :name => "Velociraptor", :top_speed => "25 m/s",
              :can => {
                :open_doors => true,
                :turn_at_any_angle_at_any_velocity => true
              }
            })
 
# Man kan sedan hämta ut datat ur databasen med metoden find_first.
peter  = coll.find_first(:name => 'Peter')
raptor = coll.find_first(:top_speed => '25 m/s')
 
# Man kan även hämta alla dokument i en collection
coll.find.each do |doc|
  puts doc.inspect
end

Vidare läsning

Jag har bara skrapat lite lätt på ytan av allt som går att göra med MongoDB, om du tycker att det verkar intressant så rekomenderar jag följande länkar: