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).

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

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:

De datum waarop de laatste wijzigingen zijn doorgevoerd weergeven:

Het eind resultaat:

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 vooriedere 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 ;-)