To SQL_CALC_FOUND_ROWS or not to SQL_CALC_FOUND_ROWS

Chiel Wester do 14 jan 10

MySQL kent een handige functie die SQL_CALC_FOUND_ROWS heet. Hiermee berekent MySQL het totaal aantal gevonden rijen voor een Query, ook wanneer er gebruik gemaakt word van een limit en een offset. Hierdoor heb je geen aparte count query meer nodig.

mysql> select SQL_CALC_FOUND_ROWS * from users ORDER BY name LIMIT 1;
mysql> SELECT FOUND_ROWS();

=> 312343;

Het gebruik hiervan heeft echter een (dure) prijs. Wanneer er gebruik gemaakt word van SQL_CALC_FOUND_ROWS, maakt MySQL niet langer gebruik van de indexen die op een tabel liggen.

In bovenstaand voorbeeld zal dan ook geen gebruik gemaakt worden van de index die op de kolom name ligt, terwijl dit bij dezelfde query zonder SQL_CALC_FOUND_ROWS wél het geval is waardoor de query vele malen sneller zal zijn.

In mijn geval duurde de query mét SQL_CALC_FOUND_ROWS meer dan 20 seconden (!) terwijl de query zonder niet meer dan 100 milliseconden in beslag neemt. De aparte count query die uitgevoerd moet worden om het aantal rijen te achterhalen maakt wél gebruik van de juiste index waardoor ook deze query een fractie in beslag neemt.

Bovenstaand verhaal is ook terug te lezen in dit artikel.
(Direct even bookmarken, die site.)

Gepost in hor |  0 reacties

Gems opnieuw installeren

Chris Brandhorst wo 13 jan 10

Na sommige systeemupdates of bij het volledig opnieuw instellen van je ontwikkelomgeving, is het noodzakelijk om je gems opnieuw te installeren.

Het is altijd handig om voordat een dergelijke actie ondernomen wordt, te controleren welke gems er geinstalleerd staan:

gem list --local

Het resultaat hiervan is bijv:

actionmailer (2.3.2, 2.0.5, 2.0.2, 1.3.6)
actionwebservice (1.2.6)
activemerchant (1.4.1)
activerecord (2.3.2, 2.0.5, 2.0.2, 1.15.6)
acts_as_ferret (0.4.1)
authlogic (2.1.1)
authlogic-oid (1.0.4)
builder (2.1.2)
...

Dit resultaat kan je ergens opslaan als referentie. Maar om nou al deze gems apart te gaan installeren…

Dit probleem had ik vorige week ook, dus heb hier een klein Ruby scriptje voor geschreven:

list_text = File.new("/Users/chris/Desktop/gem_list.txt", "r")
while (line = list_text.gets)
  match = line.match(/^([^\s]*)\s\(([^)]*)/)
  name = match[1]
  versions = match[2].split(", ")
  versions.sort.each do |v|
    puts "Installing #{name} v#{v}..."
    system "gem install #{name} -v #{v}"
    puts "done"
    puts ""
  end
end
puts "All done!"
list_text.close

Het ‘system’ commando was hierbij nieuw voor mij. Anders dan de backtick (`) operator ondersteund het system commando zowel de output en de input richting de system console. Dit houdt in dat als je je password in moet voeren, dit gewoon kan, en het resultaat van de installatie kan je gewoon teruglezen.

Gepost in hor |  0 reacties

Jekyll

Dax Huiberts di 12 jan 10

Jekyll is een statische site generator waarmee je gemakkelijk een blog kan maken.

In tegenstelling to Ruby on Rails wat een hele ruby omgeving nodig heeft om te runnen op je webserver, is Jekyll het volledige tegenovergestelde. Je schrijft je blog artikelen in simpele textile of markdown tekstbestanden (dus geen database nodig) en met behulp van een simpele command line tool kan je deze bestanden inclusief layouts omzetten in statische html bestanden. Deze bestanden kan je dan op een simpele host uploaden die geen ruby hoeft te ondersteunen.

Maar Jekyll kan nog veel meer. Met behulp van ‘YAML Front Matter’ kan je metadata aan je artikelen meegeven, zoals de titel of welke layout gebruikt moet worden of zelfs in welke categorie het artikel thuis hoort. De layout files kan je opmaken met Liquid templating waar veel template data voor beschikbaar is. Ook de permalinks zijn volledig instelbaar.

Maar het blijft niet bij een statisch gegenereerde blog. Het is ook mogelijk om helemaal af te wijken hiervan en een mooie gestructureerde content site op te zetten. Zie bijvoorbeeld git ready als perfect voorbeeld hiervan, of bekijk één van de vele andere sites die met Jekyll zijn gemaakt.

Gepost in hor |  0 reacties

Independent validations met validation_scopes en validation_scenarios

Paul Engel ma 11 jan 10

Vorige week heeft Gabe da Silveira oftewel dasil003 op Github de gem validation_scopes gepubliceerd. Met behulp van deze gem is het mogelijk om scopes mee te geven aan validaties van een ActiveRecord model.

Hierdoor kun je dus nog steeds de kracht van ActiveRecord validations gebruiken voor het retourneren meldingen die alleen gelden in een bepaalde context. Merk op dat het opslaan van het object dan gewoon mogelijk is.

In onderstaand voorbeeld heeft de Film model binnen de :warnings scope een validatie die waarborgt dat de title gecapitalized moet zijn:

class Film < ActiveRecord::Base
  validates_presence_of :title

  validation_scope :warnings do |f|
    f.validate :ensure_title_is_capitalized
    f.validates_presence_of :attribute_foo
  end

  def ensure_title_is_capitalized
    warnings.add(:title, "should be capitalized") unless title =~ %r{\A[A-Z]}
  end
end

In de console:

film = Film.new(:title => "lowercase title")
film.valid?
=> true

film.no_warnings?  # analogisch aan valid?
=> false           
                   
film.has_warnings? # analogisch aan invalid?
=> true            
                   
film.warnings      # analogisch aan film.errors
=> #<ActiveRecord::Errors>

film.warnings.full_messages
=> ["Title should be capitalized"]

film.errors.full_messages
=> []

film.save
=> true

Wil je ook het opslaan van het object verbieden wanneer het in een bepaalde context niet voldoet aan bepaalde validaties? Dan kun je beter de plugin validation_scenarios van freetwix gebruiken.

In onderstaand voorbeeld heeft de Event model binnen de :reviewer scenario een validatie voor het verplicht invullen van de :reviewer_note attribuut.

class Event < ActiveRecord::Base
  validates_presence_of :title

  in_scenario :reviewer do |e|
    e.validates_presence_of :reviewer_note
  end
end

In de console:

event = Event.new
event.save
=> false

event.title = "RubyEnRails Conf 2010"
event.save
=> true

event.save_in_scenario(:reviewer)
=> false

event.reviewer_note = "It rules!"
event.save_in_scenario(:reviewer)
=> true

Update: Merk op dat validation_scenarios ook om kan gaan met state_machine. Een perfect match lijkt mij en uitermate handig!

Gepost in hor |  0 reacties

CoffeeScript: HAML voor javascript?

Johan Vermeulen vr 08 jan 10

Al enige tijd bestaat er voor Rails templates de tegenhanger HAML en voor stylesheets SASS dus kon JavaScript natuurlijk niet achterblijven, meet CoffeeScript.

CoffeeScript bestaat uit een makkelijk leesbare syntax dat omgezet wordt naar javascript.

Hieronder enkele voorbeelden:

CoffeeScript:

# Assignment:
number: 42
opposite_day: true

Javascript:

var __a, __b, __c, __d, cubed_list, list, math, num, number, opposite_day, race, square;
// Assignment:
number = 42;
opposite_day = true;

CoffeeScript:

# Conditions:
number: -42 if opposite_day

Javascript:

// Conditions:
if (opposite_day) {
  number = -42;
}

CoffeeScript:

# Functions:
square: x => x * x

Javascript:

// Functions:
square = function square(x) {
  return x * x;
};

Vooralsnog is het vooral een hobbyproject en er zitten nog fouten in de lexer.

Gepost in hor |  0 reacties

HollandOnRails jaaroverzicht 2009

Chiel Wester wo 06 jan 10

Het nieuwe jaar is inmiddels alweer 6 dagen begonnen. Hoog tijd om terug te blikken op het afgelopen jaar!

Tweeduizend-negen begon met de mededeling dat er een merge zou gaan plaatsvinden tussen RubyOnRails en Merb. Deze geheel nieuwe en verbeterde versie zal versie 3 worden. Na een jaar tijd is er nog geen eerste release van rails 3 geweest, maar is er (uiteraard) wel een werkende edge versie beschikbaar.

Eind januari werd Railsconf Europe 2009 geannuleerd. Reden was dat het evenement te weinig geld in het laatje bracht bij organisator O’Reilly.

In maart 2009 werd Rails 2.3 uitgebracht. Inmiddels zitten we op versie 2.3.5 waarbij de minor releases allemaal kleine bugfixes en enkele security fixes waren.

In oktober werd door ons de RubyEnRails conferentie voor de vierde keer georganiseerd. Dit jaar bestond de conferentie voor het eerst uit twee dagen. Er waren aansprekende sprekers aanwezig waaronder Yehuda Katz en Jeremy Kemper. Op dag 2 werd er bovendien een RubyEnRails Rumble gehouden en deze werd gewonnen door Kabisa.

Wat zal 2010 ons op RubyOnRails gebied gaan brengen? 2010 zal het jaar worden van Rails 3.0, de eerste jubileum-editie van de RubyEnRails-conferentie en wat ons betreft het jaar van BettyBlocks.

Eén ding zal in 2010 niet veranderen:

HollandOnRails is ook in 2010 weer een vaste waarde!

Gepost in hor |  0 reacties

Massa toewijzing in Rails

Stephan Kaag di 05 jan 10

De gevolgen voor de veiligheid van een applicatie ten gevolge van mass assignment in Rails zijn al vanaf de eerste versie gedocumenteerd. Toch blijken lang niet alle applicaties hier goed mee om te gaan.

Mass assignment

@user = User.new(params[:user])

In de regel hierboven wordt mass assignment gebruikt om een nieuwe User instantie aan te maken en direct alle (door de browser verstuurde) attributen in te stellen.
Als er geen extra maatregelen worden genomen kan iemand met kwaad in de zin zijn eigen parameters meesturen en deze dus direct (automagisch) laten instellen. Stel dat een er een kolom is_admin bestaat, dan is in die normaal gesproken direct beïnvloedbaar voor misbruik met alle mogelijke gevolgen van dien.

has_many :blog_posts

Het zijn niet alleen database kolommen die op deze manier misbruikt kunnen worden. Stel je voor dat de bovenstaande regel ook in het user-model aanwezig is. Doordat has_many toestaat om direct de id’s via mass assignment in te stellen kan een kwaadwillende user[blog_post_ids][] meesturen om toegang te krijgen tot iemand anders’ blog-posts!

Beveiliging

Rails biedt de class method attr_accessible aan die een whitelist- oplossing gebruikt voor beveiliging. Als je attr_accessible gebruikt kan je de attributen aangeven die je via mass-assignment instelbaar wilt maken en alle andere attributen zullen beveiligd worden.

Gepost in hor |  1 reactie

Gem-this

Stephan Kaag di 22 dec 09

Traditionele Rails plugins worden meer en meer vervangen door gems. Gems hebben dan ook voordelen boven plugins. Denk aan distributie (rubygems), versiebeheer en dependencies.

Met de gem (jawel) gem-this wordt het maken van een rubygem je makkelijker gemaakt. Door na installatie in een source-map gem this uit te voeren wordt er een Rakefile voor je aangemaakt.

$ rake -T
rake clean                   # Clear out RDoc and generated packages
rake clobber_package         # Remove package products
rake clobber_rdoc            # Remove rdoc products
rake gem                     # Build the gem file gem-this-0.1.0.gem
rake package                 # Build all the packages
rake rdoc                    # Build the rdoc HTML Files
rake repackage               # Force a rebuild of the package files
rake rerdoc                  # Force a rebuild of the RDOC files
rake rubyforge:release       # Release gem and RDoc documentation to RubyForge
rake rubyforge:release:docs  # Publish RDoc to RubyForge.

Je kan nu direct een gem bakken door rake package te vuren maar waarschijnlijk wil je nog wel zaken aanpassen aan je Rakefile of .gemspec. Gem-this is dan ook enkel bedoeld om je de basis van het gem-builden uit te handen te nemen.

Gepost in hor |  0 reacties

Variabelen gebruiken in Wireframes

Gawin Dapper di 22 dec 09

Vorige keer hebben we het maken van Wireframes met OmniGraffle besproken. Als uitbreiding hierop zullen we vandaag het invoegen van variablen bespreken.

OmniGraffle Variables

In OmniGraffle is het mogelijk om variablen in tekstvelden te gebruiken welke automatisch aangepast worden. De volgende variabelen zijn beschikbaar:

  • Canvas Name, <%Canvas%>
  • Layer Name, <%Layer%>
  • Document, <%Document%>
  • Current Date, <%Date%>
  • Document Creation Date, <%CreationDate%>
  • Document Modification Date, <%ModificationDate%>
  • Creator, <%Creator%>
  • Modifier, <%Modifier%>
  • Page Number, <%#%>
  • Total Pages, <%TotalPages%>
  • X Position, <%X%>
  • Y Position, <%Y%>
  • Width, <%Width%>
  • Height, <%Height%>
  • Line Length, <%Length%>

Deze variablen zijn tevens te vinden via het menu Edit > Insert Variable.

Tekstvelden

De bovenstaande variabelen zijn vervolgens te gebruiken in elk tekstveld (inclusief opmaak).

OmniGraffle Variables

Hierbij is de Line Length een vreemde eend in de bijt, aangezien deze de lengte van een lijn in een lijn label laat zien.

OmniGraffle Variable Line Length

Gebruik in Wireframes

In de Wireframes kunnen we deze nu gebruiken om extra informatie op de pagina weer te geven. Dit kan bijvoorbeeld erg prettig zijn bij het maken van print-outs.

De Canvas Name weergeven in de header:
Wireframe Header, Date

De datum waarop de laatste wijzigingen zijn doorgevoerd weergeven:
Wireframe Header, Canvas Name

Het eind resultaat:
Wireframe Header, Original

Bron bestanden:

Gepost in  |  0 reacties

Is MongoDB hetgeen voor databases wat Rails was voor frameworks?

Paul Engel di 22 dec 09

John van Railstips heeft onlangs een artikel gepost met een gewaagde stelling:

MongoDB is hetgeen voor databases wat Rails was voor frameworks.

Hij heeft namelijk Harmony, een website gedreven op MySQL, omgezet naar Mongo en is erg te spreken over deze migratie. John onderbouwt zijn stelling met de volgende punten:

  • Migrations are Dead
  • Single Collection Inheritance Gone Wild
  • Array Keys
  • Hash Keys
  • Embedding Custom Objects
  • Incrementing and Decrementing
  • Files, aka GridFS

Geïnteresseerd? Lees dan het volledige artikel.

Gepost in hor |  0 reacties

Welkom op Holland On Rails

Het startpunt voor Ruby On Rails in Nederland. Vind de laatste technieken, meningen en nieuwtjes.

Recente Jobs

Gezocht: Ruby On Rails ontwikkelaar (junior of senior)

Eet, drink en droom jij over Ruby On Rails? Wil jij het liefste dag en nacht bezig zijn met jehobby; super coole webapplicaties ontwikkelen in Ruby On Rails?

Dan willen wij jou graag een podium bieden om je Ruby skills te vertonen aan onze nationale en internationale klanten!

@ Internetbureau Holder, Obdam

Bekijk alle jobs »»

Gereedschapskist

Onmisbare tools voor
iedere developer!
Ruby On Rails
Framework voor de web 2.0 developer. Eindelijk vooruitgang!
TextMate
Editor for true pro's
Typ, tab, top :-)
Nee, niet voor Win.
Made On A Mac
En nou is het over met die saaie grijze Windows bak van je!

Auteurs op deze site

Chris Obdam

'Less is more' evangelist, past dit ook dagelijks toe op zijn tandenborstel.

Chiel Wester

Snelheidswonder op Ruby wielen. Leuk om mee te pair-programmen ;-) Recommend Me
Src-120-attending

Stephan Kaag

Het eerste Rails coreteam- member uit Nederland? Rails evangelist van het eerste uur.

Paul Engel

Én Rails programmeren én interfaces designen? Je zou hem superman kunnen noemen..

Dax Huiberts

Official Zip-Programmer, skinny code is helemaal zijn ding. Haalt meer code weg dan dat er bij komt.

Freek Monteban

Het nieuwste telg uit het Holland on Rails nest! Hij doet niets anders meer!

Johan Vermeulen

De stylesheet-koning uit de kop van Noord-Holland!