mardi, mars 28, 2006

[Rails] Find by {inserer le nom du champs ici}

Je viens de découvrir un truc génial (encore un):
Ceux qui ont fait des appli qui accèdent à la base de donnée auront surement déjà au besoin d'ajouter des méthodes du genre Adresse.findByCodePostal(codepostal).
Evidement à chaque fois on a jamais celle qui nous faut... avec hibernate le code est relativement simple à écrire. Mais avec Rails c'est encore plus simple! Il n'y a pas besoin de l'écrire!

Imaginons que j'ai une table items avec comme colonne "title", "quantity", "price"...
J'écris directement (dans mon test unitaire par exemple):
  Item.find_by_title('test title')
  Item.find_by_quantity(8)
  Item.find_by_price(123.45)

En fait les find_by_xxx() sont créées à la volée! C'est génial! Il suffit que mon champs existe en base et la méthode correspondante existe toute seule!
Technorati tags:

[Rails] Comment avoir la liste des taches rake

J'oublie toujours la commande, alors je me la marque ici une bonne fois pour toute:
> rake --tasks

rake add_new_scripts          # Add new scripts to the application script/ directory
rake apidoc                   # Build the apidoc HTML Files
rake appdoc                   # Build the appdoc HTML Files
rake clear_logs               # Clears all *.log files in log/
rake clobber_apidoc           # Remove rdoc products
rake clobber_appdoc           # Remove rdoc products
rake clobber_plugindoc        # Remove plugin documentation
rake clone_schema_to_test     # Recreate the test database from the current environment's database schema.
rake clone_structure_to_test  # Recreate the test databases from the development structure
rake create_sessions_table    # Creates a sessions table for use with CGI::Session::ActiveRecordStore
rake db_schema_dump           # Create a db/schema.rb file that can be portably used against any DB supported by AR.
rake db_schema_import         # Import a schema.rb file into the database.
rake db_structure_dump        # Dump the database structure to a SQL file
rake default                  # Run all the tests on a fresh test database
rake drop_sessions_table      # Drop the sessions table
rake freeze_edge              # Lock this application to the Edge Rails (by exporting from Subversion).  Defaults to svn HEAD; do 'rake free
VISION=1234' to lock to a specific revision.
rake freeze_gems              # Lock this application to the current gems (by unpacking them into vendor/rails)
rake load_fixtures            # Load fixtures into the current environment's database
rake migrate                  # Migrate the database according to the migrate scripts in db/migrate (only supported on PG/MySQL). A specific
an be targetted with VERSION=x
rake plugindoc                # Generate documation for all installed plugins
rake prepare_test_database    # Prepare the test database and load the schema
rake purge_sessions_table     # Drop and recreate the session table (much faster than 'DELETE * FROM sessions')
rake purge_test_database      # Empty the test database
rake reapidoc                 # Force a rebuild of the RDOC files
rake reappdoc                 # Force a rebuild of the RDOC files
rake recent                   # Run tests for recentprepare_test_database
rake stats                    # Report code statistics (KLOCs, etc) from the application
rake test_functional          # Run tests for test_functionalprepare_test_database
rake test_plugins             # Run tests for test_pluginsenvironment
rake test_units               # Run tests for test_unitsprepare_test_database
rake unfreeze_rails           # Unlock this application from freeze of gems or edge and return to a fluid use of system gems
rake update_javascripts       # Update your javascripts from your current rails install.

rem: Ce n'est uniquement valable pour rails mais pour tous les rake.
Technorati tags:

[Rails] changer la taille d'un text area

Petite astuce toute simple: "Comment changer la taille d'un text area dans rails?"
<%= text_area 'user', 'address', :rows => 2  %>
Technorati tags:

lundi, mars 27, 2006

Mon "Opinion Forum System" à moi

Je suis dégouté, j'avais une super idée de forum très web2.0 et puis voilà que quelqu'un a eu la même: Opinion Forum System
Je crois que je le ferais quand même... à 1 mois près, juste parce que j'ai pas eu le temps de m'en occuper...
Par contre j'ai rien vu concernant les licences et ça a l'air d'être un site perso qui héberge le site...
Si je fais une jolie licence GNU ou Apache ou un truc dans le style je pourrai toujours me démarquer!

[Rails] Nouvelle stratégie de test dans Ruby on rails

Voilà un post interessant de Mike Clark (celui qui a implémenté les tests dans Rails) qui explique quelles modifications il a apporté aux tests pour que ceux-ci passent plus vite.
Il a tout simplement fait un "rollback" à la fin de chaque test, ça évite d'avoir à supprimer les données insérées :)
Pour ceux qui connaissent ca ressemble à la stratégie utilisé dans les Tests de Spring Framework (AbstractTransactionalDataSourceSpringContextTests).
Technorati tags:

lundi, mars 13, 2006

Transformer des logs du garbage collector en fichier csv

Voici un petit script qui permet de transformer les logs obtenus en passant les paramètres "-verbose:gc -Xloggc:/temp/jvm.log" à la jvm en java pour voir l'utilisation de la mémoire.
Les logs obtenus ressemblent à ça:
0.000: [GC 508K->138K(1984K), 0.0042681 secs]
0.074: [GC 650K->251K(1984K), 0.0030702 secs]
0.198: [GC 763K->305K(1984K), 0.0035574 secs]
0.272: [GC 817K->465K(1984K), 0.0033527 secs]
0.320: [GC 976K->523K(1984K), 0.0020841 secs]
...
0.557: [Full GC 1489K->1015K(2112K), 0.0256656 secs]
...
Cette version est plus compacte mais moins facile à lire (à mon avis) que la seconde, on split la ligne en utilisant plusieurs séparateurs: K ou [GC ou ( ou -> ...
def change_to_csv(csv_file, line)
  puts(line)
  # 0.000: [GC 508K->138K(1984K), 0.0042681 secs]
  # 0.563: [Full GC 1488K->1005K(2112K), 0.0253077 secs]
  array = line.split(/(:)|( \[GC )|( \[Full GC )|(->)|(\))|(K)|(\()/)
  time = array[0]
  puts("time: " + time)
  before_gc = array[4]
  puts("before_gc: " + before_gc)
  after_gc = array[8]
  puts("after_gc: " + after_gc)
  
  csv_file << (time + ";" + before_gc + ";" + after_gc + ";\n")
end

File.open("jvm.csv", File::CREAT|File::RDWR) do |csv_file|
  csv_file << ("time;before_gc;after_gc;\n")
  IO.foreach("jvm.log") { |line| change_to_csv(csv_file, line) } 
end
La seconde version où on split au fur et à mesure (par dicotomie en quelque sorte):
def change_to_csv(csv_file, line)
  puts(line)
  # 0.000: [GC 508K->138K(1984K), 0.0042681 secs]
  # 0.563: [Full GC 1488K->1005K(2112K), 0.0253077 secs]
  split_time = line.split(':')
  time = split_time[0]
  puts("time: " + time)
  rest = split_time[1]
  split_gc = rest.split('->')
  before_gc = split_gc[0].split('GC ')[1].split('K')[0]
  puts("before_gc: " + before_gc)
  after_gc = split_gc[1].split('K')[0]
  puts("after_gc: " + after_gc)
  
  csv_file << (time + ";" + before_gc + ";" + after_gc + ";\n")
end

File.open("jvm.csv", File::CREAT|File::RDWR) do |csv_file|
  csv_file << ("time;before_gc;after_gc;\n")
  IO.foreach("jvm.log") { |line| change_to_csv(csv_file, line) } 
end
Dans les deux cas on cherche un fichier jvm.log et on fait un fichier jvm.csv qui resemble à ça:
time;before_gc;after_gc;
0.000;508;138;
0.073;650;251;
0.200;763;305;
0.274;817;465;
0.322;976;523;
0.379;1035;537;
0.408;1049;722;
0.426;1234;802;
0.433;1298;837;
...
Il y a plus qu'à le passer dans excel et hop de jolies courbes!
Rem: je l'ai écrit rapidement, on peut surement faire plus élégant, mais mon but était l'efficacité et pour ça ruby est génial ;)
Technorati tags:

mardi, février 28, 2006

[Rails] Quoi de neuf dans Rails 1.1

Plein de bonne choses dans Rails 1.1 - cf la liste complète.
Technorati tags:

[Rails] La structure des répertoires

Une petite cheatsheet (anti-sèche) pour savoir à quoi servent les répertoires de rails.
Bien pratique!
Technorati tags:

[Rails] Ajax Scaffold

Le célèbre Scaffold de rails a été porté en Ajax.
On démarre tout de suite et on fait de l'ajax sans avoir à taper plein de code. Génial!

Source: Julien (en parlant d'ajax suivez son tour d'horizon des frameworks ajax ;) )
Technorati tags:

[Rails] Première RailsConf

Cela faisait quelques temps que je n'avais posté :)
Voilà quelques news rapides.
La première RailsConf (c'est à dire Conférence Rails) va se tenir au Canada avec des invité de choix!
  • Dave Thomas
  • David Heinemeier Hansson
  • Paul Graham
  • Martin Fowler
C'est bon signe pour Rails et Ruby!
Technorati tags:

lundi, février 20, 2006

[Rails] Pourquoi Rails ne génère pas les clefs étrangères ?

Et bien c'est un choix, pas une limitation! et oui!
C'est étonnant mais DHH nous donne l'explication: Choose a single layer of cleverness.
D'une manière générale c'est une discussion interéssante sur la place des bases de données dans le développement d'un projet moderne:
And realize that my opinions are confined to dealing with application databases (and that doing integration through the database belongs in a time where Beverly Hills 90210 was a hit show on TV). Hopefully that calmed you down again.
Technorati tags:

vendredi, février 03, 2006

Traiter des fichiers Microsoft Office (Word, Excel....) avec du ruby

Je n'ai pas eu l'occasion de l'essayer pour l'instant mais un jour où l'autre on est confronté à la génération ou la lecture de fichiers word ou excel...
Donc c'est intéressant de savoir que POI de apache a été porté en Ruby! (Youpi!)
Technorati tags:

lundi, janvier 30, 2006

Un jolie site de doc pour ruby

Le site de doc pour ruby a fait peau neuve. C'est jolie et clair j'aime bien :)
Vu sur o'reilly
Technorati tags:

elsif ou elseif ?

J'ai eu besoin d'utiliser un "elseif" en ruby et j'ai été étonné de découvrir qu'en ruby (apparement comme en perl), ça s'écrit "elsif"... pourquoi pas mais bon j'aurai préféré "elseif" et apparement je suis pas le seul! cf ce mail sur la mailing list ruby-talk.
Technorati tags:

Test d'un object "nil"

Un petit truc qui a l'air de rien comme ça mais qui est bien pratique:
  object = nil
  if(object)
    puts 'on ne voit pas ce message'
  end
Si un objet et nil, le test est false.
Ca veut dire que ce n'est plus la peine de faire comme en java:
  Object object = null;
  if(object!=null) {
    System.out.println("on ne voit pas ce message");
  }
Technorati tags:

dimanche, janvier 29, 2006

[Rails] Les mots clefs a ne pas utiliser (c.à.d les mots réservés)

Un petit script pour connaître les mots réservés:
>ruby -r config/environment -e 'print Object.constants.sort.join(", ")'
Résultat:
ARGF, ARGV, ActionController, ActionMailer, ActionPack, ActionView, ActionWebSer
vice, ActiveRecord, ActiveSupport, ArgumentError, Array, BREAKPOINT_SERVER_PORT,
 Base64, BasicSocket, Benchmark, Bignum, Binding, Buffering, Builder, CGI, CGIMe
thods, CROSS_COMPILING, Class, ClassInheritableAttributes, Comparable, Condition
Variable, Config, Continuation, Controllers, DRb, DRbIdConv, DRbObject, DRbUndum
ped, Data, Date, DateTime, Delegater, Delegator, Dependencies, Deprecated, Diges
t, Dir, ENV, EOFError, ERB, Enumerable, Errno, Exception, FALSE, FalseClass, Fcn
tl, File, FileTest, FileUtils, FireRuby, Fixnum, Float, FloatDomainError, Forwar
dable, GC, Gem, HTML, Hash, HashWithIndifferentAccess, IO, IOError, IPSocket, IP
socket, IndexError, Inflector, Integer, Interrupt, Kconv, Kernel, LoadError, Loc
alJumpError, Logger, MailHelper, Marshal, MatchData, MatchingData, Math, Method,
 MissingSourceFile, Module, Mutex, Mutex_m, NIL, NKF, NQXML, NameError, Net, Nil
Class, NoMemoryError, NoMethodError, NotImplementedError, Numeric, Object, Objec
tSpace, Observable, OpenSSL, OrderedOptions, PLATFORM, PStore, ParseDate, ParseE
rror, Pathname, Precision, Proc, Process, Queue, RAILS_CONNECTION_ADAPTERS, RAIL
S_DEFAULT_LOGGER, RAILS_ENV, RAILS_ROOT, RAILTIES_PATH, RELEASE_DATE, REXML, RUB
Y_PLATFORM, RUBY_RELEASE_DATE, RUBY_VERSION, Racc, Rails, Range, RangeError, Rat
ional, Regexp, RegexpError, RuntimeError, SOAP, STDERR, STDIN, STDOUT, ScanError
, ScriptError, SecurityError, Set, Signal, SignalException, SimpleDelegater, Sim
pleDelegator, SingleForwardable, Singleton, SizedQueue, Socket, SocketError, Sor
tedSet, StandardError, String, StringIO, StringInput, StringOutput, StringScanne
r, Struct, Symbol, SyntaxError, SystemCallError, SystemExit, SystemStackError, T
CPServer, TCPSocket, TCPserver, TCPsocket, TMail, TOPLEVEL_BINDING, TRUE, Text,
Thread, ThreadError, ThreadGroup, Time, TimeZone, Timeout, TimeoutError, Transac
tion, TrueClass, TypeError, UDPSocket, UDPsocket, URI, UnboundMethod, VERSION, W
in32API, XML, XMLEncoding, XMLParser, XMLParserError, XMLRPC, XSD, XmlSimple, YA
ML, ZeroDivisionError, Zlib
Vu sur: Gotcha du wiki ruby on rails
Technorati tags:

mardi, janvier 24, 2006

[Rails] Connaître la configuration exacte (versions etc...) de mon projet

Voilà le genre de petite pépite cachée dans rails, ceux qui vécu le "Jar Hell" apprécieront:
C:\developpement\workspaces\workspaceRuby\projet>ruby script/about
About your application's environment
Ruby version                 1.8.2 (i386-mswin32)
RubyGems version             0.8.10
Rails version                1.0.0
Active Record version        1.13.2
Action Pack version          1.11.2
Action Web Service version   1.0.0
Action Mailer version        1.1.5
Active Support version       1.2.5
Application root             C:/developpement/workspaces/workspaceRuby/projet
Environment                  development
Database adapter             mysql
Technorati tags:

lundi, janvier 23, 2006

Problème de connection MySQL 4.1

Je viens juste d'avoir un problème avec Ruby / ActiveRecord / MySql 4.1 sous Windows XP!! J'en fait un post parce que c'est assez vicieux. Voilà le code de mon script, il est supposé se connecter à une table de la base de donnée et faire un select dedans:
require "rubygems"
require_gem "activerecord"

# probleme de mysql
# http://jeroen.concept-q.biz/files/
ActiveRecord::Base.establish_connection(
     :adapter  => "mysql",
     :host     => "mysql.machine",
     :username => "user",
     :password => "password",
     :database => "dotproject")
     
class TaskLog < ActiveRecord::Base 
 set_table_name "task_log"
 set_primary_key "task_log_id"
end

task_logs = TaskLog.find(:all, :conditions => "task_log_creator = '49'")
for task_log in task_logs
 puts task_log.task_log_id
end

Voilà le genre de messages que j'avais:
Mysql::Error: Lost connection to MySQL server during query: 
SELECT * FROM task_log WHERE (task_log_creator = '49')  (ActiveRecord::StatementInvalid)

Ce code fonctionnait sur ma base de donnée en local mysql 5.0 mais pas sur la base distante en 4.1!!!
Solution:J'ai trouvé la solution sur le wiki de rails mais elle ne me plait pas trop :(
Il faut télécharger msvcr70.dll et mysql-ruby-win32.rar > ...mysql-4.1.15\mysql.so.
Les mettre sous:
  • C:\ruby\lib\ruby\bin\msvcr70.dll
  • C:\ruby\lib\ruby\1.8\i386-mswin32\mysql.so
et ca fonctionne.
ATTENTION:C'est clairement une bidouille, dans mon cas c'est juste un petit script pour moi. J'éviterai de faire ca en production dans un autre cas!
Technorati tags:

vendredi, janvier 20, 2006

[Rails] Mettre un encoding différent dans rails

Par défaut l'encoding dans rails est mis à utf-8. Pour le changer de manière globale il suffit de rajouter ces quelques lignes dans controllers/application.rb:
  before_filter :set_charset
  
  def set_charset
    @headers["Content-Type"] = "text/html; charset=iso-8859-1"
  end
Quelques liens interessants sur le sujet:
Technorati tags:

jeudi, janvier 19, 2006

Les conséquences de la guerre des brevets dans IE

Un article intéressant de julien sur les conséquences de la guerre des brevets dans IE surtout au niveau des animations flash.
Technorati tags: